Javascript RegExp构造函数和Regex文本测试函数之间的区别?
我不明白这怎么可能Javascript RegExp构造函数和Regex文本测试函数之间的区别?,javascript,regex,Javascript,Regex,我不明白这怎么可能 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 如果我使用regexp文本,例如 /d/gi.te
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
如果我使用regexp文本,例如
/d/gi.test("Douglas Enas")
在chrome上背靠背运行,两次我都实现了。对此有何解释
chrome控制台中使用构造函数创建regexp对象的背靠背运行示例
matcher = new RegExp("d","gi")
/d/gi
matcher.test("Douglas Enas")
true
matcher.test("Douglas Enas")
false
matcher
/d/gi
对literal使用背对背调用的示例
/d/gi.test("Douglas Enas")
true
/d/gi.test("Douglas Enas")
true
这个问题的原因是,如果对值列表使用RegExp构造函数和test函数,我会丢失匹配项。。。然而,使用文本,我得到了我期望的所有值
更新
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”。现在,我仍然不确定每次我在重复建议数组时进行测试时创建一个新表达式是否会无意中排除结果,这仍然有点令人困惑,并且可能与匹配测试的进展有关:
test
在同一个全局正则表达式实例上多次调用将超过上一个匹配
因此,基本上,当您有一个RegExp
实例时,对test
的每次调用都会推进匹配器。一旦你找到了第一个d
,它将超越这个范围,尝试找到另一个d
。现在没有了,所以它返回false
另一方面,当您这样做时:
/d/gi.test("Douglas Enas")
您每次在现场创建一个新的
RegExp
实例,因此它总是会找到第一个d
(从而返回true
)。根据Mozilla开发者网络
与exec(或与之结合使用)一样,test被多次调用
在同一个全局正则表达式上,实例将前进超过
上一场比赛
我找不到链接ATM,但我记得,这是
测试方法与g
模式组合的一个已知问题:匹配位置并没有以某种方式“忘记”。放下全局标志和/或使用.match
方法,它就可以正常工作了
我无法重现这个问题,我每次都会得到这个代码:var matcher=new RegExp(“d”,“gi”);匹配测试(“Douglas Enas”);因此,在jqueryvar matcher=newregexp(“d”,“gi”)中将其与grep一起使用的情况下;var arr=$.grep(建议,函数(项){return matcher.test(项);})代码>这将如何排除匹配值?啊,我将正则表达式的创建移到了闭包中,它包含了缺少的值。。。var arr=$.grep(建议,函数(项){var matcher=newregexp(“d”,“gi”);返回matcher.test(项);});