RegExp构造函数和Regex文字测试函数之间的区别?

时间:2012-11-21 19:19:48

标签: 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

如果我使用正则表达式文字,例如

/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”。我仍然不确定现在每次进行测试时都会创建一个新的表达式,当我迭代建议数组时会无意中排除结果仍然有点令人困惑,并且可能与匹配测试的进展有关

3 个答案:

答案 0 :(得分:10)

来自RegExp.test()

  在同一个全局正则表达式实例上多次调用的

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方法,它会正常工作。