javascript - 为什么 Javascript 的 regex.exec() 不总是返回相同的值?

标签 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);

演示: http://jsfiddle.net/pPW8Y/1/

关于javascript - 为什么 Javascript 的 regex.exec() 不总是返回相同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11477415/

相关文章:

javascript - 为什么不在单击操作时创建类选择器?

javascript - 使用 JavaScript 在 mvc 4 中使用 C# 在部分 View 中使用 HTML 打印 div

Java Scanner - 除非存在引号,否则用空格分隔?

javascript - 如何使用正则表达式按空格拆分字符串并忽略前导和尾随空格到单词数组中?

Python 正则表达式 匹配后的字符不等于

javascript - 在大写字母前插入空格

javascript - 将时间分成 30 分钟的小块

javascript - Asterisk:通过 AMI 使用模板创建用户

javascript - bootstrap btn-group 中的 angularjs 切换类

java - 获取 Java 中所有出现的二元组