我对如何做到这一点很困惑......
var matcher = new RegExp("d", "gi");
matcher.test(item)
上面的代码包含以下值
item = "Douglas Enas"
matcher = /d/gi
然而,当我连续运行matcher.test函数时,第一次运行时为true,第二次运行时为false。
matcher.test(item) // true
matcher.test(item) // false
如果我使用正则表达式文字,例如
/d/gi.test("Douglas Enas")
然后在chrome中重新运行它我两次都是真的。对此有解释吗?
在chrome控制台中背靠背运行的示例,使用构造函数
创建正则表达式对象matcher = new RegExp("d","gi")
/d/gi
matcher.test("Douglas Enas")
true
matcher.test("Douglas Enas")
false
matcher
/d/gi
使用文字
的背靠背调用示例/d/gi.test("Douglas Enas")
true
/d/gi.test("Douglas Enas")
true
这个问题的原因是因为使用RegExp构造函数和测试函数对我失去匹配的值列表...但是使用文字我得到了我期望的所有值
更新
var suggestions = [];
////process response
$.each(responseData, function (i, val)
{
suggestions.push(val.desc);
});
var arr = $.grep(suggestions, function(item) {
var matcher = new RegExp("d", "gi");
return matcher.test(item);
});
在闭包内移动匹配器的创建包括缺少的结果。 “d”实际上是一个动态创建的字符串,但为简单起见,我使用了“d”。我仍然不确定现在每次进行测试时都会创建一个新的表达式,当我迭代建议数组时会无意中排除结果仍然有点令人困惑,并且可能与匹配测试的进展有关
答案 0 :(得分:10)
在同一个全局正则表达式实例上多次调用的
test
将超过上一个匹配。
所以基本上当你有RegExp
的实例时,每次调用test
都会提升匹配器。找到第一个d
后,它会超越它,并尝试找到另一个 d
。好吧,已经没有了,所以它返回false
。
另一方面,当你这样做时:
/d/gi.test("Douglas Enas")
您每次都在现场创建一个新的RegExp
实例,因此它始终会找到第一个d
(因此返回true
)。
答案 1 :(得分:0)
根据Mozilla开发者网络,
与exec(或与exec一起)一样,多次调用 在同一个全局正则表达式实例上将超越 上一场比赛。
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/RegExp/test
答案 2 :(得分:0)
我找不到链接ATM,但我记得,这是test
方法与g
模式结合的已知问题:匹配位置不是以某种方式“忘记了”。删除全局标志和/或使用.match
方法,它会正常工作。