我试图想象一下我在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对象吗?
答案 0 :(得分:2)
According to the documentation,每次使用lastIndex
时,正则表达式对象的g
属性都会更新。在第一次匹配之后,lastIndex
将位于字符串的末尾,因此当您将其与相同的字符串进行比较时,它会在结尾处开始查找匹配项,因此它将找不到任何内容。
根据您的使用情况,您可以不使用g
或使用.match
或其他替代方案。
答案 1 :(得分:2)
如果匹配成功,则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