相同的RegExp返回不同的结果 - 第一个时间正确的结果,第二个时间为null

时间:2015-04-07 21:09:48

标签: javascript regex

我试图想象一下我在javascript中看到的一些奇怪的逻辑, 我有下一个代码:

var rgx = /(\S*)\s(\S*)/g;
rgx.exec("Yosi 1"); // returns ["Yosi 1","Yosi","1"]
rgx.exec("Yosi 1"); // returns null
rgx.exec("Yosi 1"); // returns ["Yosi 1","Yosi","1"]

为什么我第二次得到null?我需要以某种方式重置regexp对象吗?

2 个答案:

答案 0 :(得分:2)

According to the documentation,每次使用lastIndex时,正则表达式对象的g属性都会更新。在第一次匹配之后,lastIndex将位于字符串的末尾,因此当您将其与相同的字符串进行比较时,它会在结尾处开始查找匹配项,因此它将找不到任何内容。

根据您的使用情况,您可以不使用g或使用.match或其他替代方案。

答案 1 :(得分:2)

它写在MDN documentation

  

如果匹配成功,则exec()方法返回一个数组并进行更新   正则表达式对象的属性。

所以,是的,您需要重新创建对象,或者,如果您只是在测试,请使用.search()方法(因为test()也会提升lastIndex属性):

  

如果您只是为了找到真或假来执行匹配,请使用   RegExp.prototype.test()方法或String.prototype.search()   方法

     

如果正则表达式使用“g”标志,则可以使用exec()   方法多次在同一个字符串中查找连续匹配。   执行此操作时,搜索从指定的str的子字符串开始   正则表达式的lastIndex属性(test()也将提前   lastIndex属性)。

或者,您可以通过将.lastIndex property设置为0来将RegEx对象“重新调整”到起始位置:

var rgx = /(\S*)\s(\S*)/g;
alert(rgx.exec("Yosi 1")); // returns ["Yosi 1","Yosi","1"]
alert(rgx.exec("Yosi 1")); // returns null, and resets the object
alert(rgx.exec("Yosi 1")); // returns ["Yosi 1","Yosi","1"]
rgx.lastIndex = 0;         // reset it manually
alert(rgx.exec("Yosi 1")); // returns ["Yosi 1","Yosi","1"] again