在Chrome或Firebug控制台中:
reg = /ab/g
str = "abc"
reg.exec(str)
==> ["ab"]
reg.exec(str)
==> null
reg.exec(str)
==> ["ab"]
reg.exec(str)
==> null
exec在某种程度上是有状态的,取决于它上一次返回的内容吗?或者这只是一个bug?我不能让它一直发生。例如,如果上面的“str”是" abc“,就不会发生这种情况。
发布于 2012-07-14 03:53:50
JavaScript RegExp
对象是有状态的。
当正则表达式是全局的时,如果您在相同的正则表达式对象上调用一个方法,它将从索引开始,直到最后一个匹配结束。
当找不到更多的匹配项时,索引将自动重置为0
。
若要手动重置它,请设置lastIndex
属性。
reg.lastIndex = 0;
这可能是一个非常有用的功能。如果需要,可以在字符串中的任何位置开始求值,或者如果在循环中,可以在所需的匹配次数后停止求值。
下面是在循环中使用正则表达式的典型方法的演示。它通过执行赋值作为循环条件来利用这样一个事实,即当不再有匹配时,exec
返回null
。
var re = /foo_(\d+)/g,
str = "text foo_123 more text foo_456 foo_789 end text",
match,
results = [];
while (match = re.exec(str))
results.push(+match[1]);
演示: http://jsfiddle.net/pPW8Y/
如果你不喜欢赋值的位置,可以修改循环,例如...
var re = /foo_(\d+)/g,
str = "text foo_123 more text foo_456 foo_789 end text",
match,
results = [];
do {
match = re.exec(str);
if (match)
results.push(+match[1]);
} while (match);
发布于 2012-07-14 03:55:10
来自MDN docs
如果您的正则表达式使用"g“标志,则可以多次使用exec方法在同一字符串中查找连续的匹配项。执行此操作时,搜索将从正则表达式的lastIndex属性指定的字符串的子字符串开始(测试还将推进lastIndex属性)。
因为您使用的是g
标志,所以exec
将从最后一个匹配的字符串开始,直到它到达末尾(返回null
),然后重新开始。
就我个人而言,我更喜欢使用str.match(reg)
的另一种方式
发布于 2013-01-14 19:52:54
多个匹配
如果您的正则表达式需要g
标志(全局匹配),则需要使用lastIndex
属性重置索引(最后一个匹配的位置)。
reg.lastIndex = 0;
这是由于exec()
将stop on each occurence so you can run again on the remaining part的事实。此行为也存在于test()
中):
如果您的正则表达式使用"g“标志,则可以多次使用exec方法在同一字符串中查找连续的匹配项。执行此操作时,搜索将从正则表达式的lastIndex属性指定的字符串的子字符串开始(测试还将推进lastIndex属性)
单项匹配
当只有一个可能的匹配项时,您可以通过省略g
标志来简单地重写正则表达式,作为index will be automatically reset to 0
。
https://stackoverflow.com/questions/11477415
复制相似问题