相同的RegExp返回不同的结果-第一次是正确的结果,第二次是null



我正在试图弄清楚我在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"]

为什么第二次我变空了?我需要以某种方式重置regexp对象?

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

您可以不使用g,也可以使用.match,或者根据您的用例使用其他选项。

在MDN文档中,

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

因此,是的,您需要重新创建对象,或者,如果您只是在测试,则使用.search()方法(因为test()也将推进lastIndex属性):

如果执行匹配只是为了查找true或false,请使用RegExp.protype.test()方法或String.protype.search()方法

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

或者,您可以通过将.lastIndex属性设置为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

最新更新