<分区>
在 Chrome 或 Firebug 控制台中:
reg = /ab/g
str = "abc"
reg.exec(str)
==> ["ab"]
reg.exec(str)
==> null
reg.exec(str)
==> ["ab"]
reg.exec(str)
==> null
exec 是否以某种方式是有状态的并且取决于它上次返回的内容?或者这只是一个错误?我不能让它一直发生。例如,如果上面的“str”是“abc abc”,它就不会发生。
标签 javascript regex
<分区>
在 Chrome 或 Firebug 控制台中:
reg = /ab/g
str = "abc"
reg.exec(str)
==> ["ab"]
reg.exec(str)
==> null
reg.exec(str)
==> ["ab"]
reg.exec(str)
==> null
exec 是否以某种方式是有状态的并且取决于它上次返回的内容?或者这只是一个错误?我不能让它一直发生。例如,如果上面的“str”是“abc abc”,它就不会发生。
最佳答案
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);
关于javascript - 为什么 Javascript 的 regex.exec() 不总是返回相同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11477415/