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