首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么Javascript的regex.exec()并不总是返回相同的值?

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

Stack Overflow用户
提问于 2012-07-14 03:51:45
回答 3查看 48K关注 0票数 136

在Chrome或Firebug控制台中:

代码语言:javascript
运行
复制
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“,就不会发生这种情况。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-14 03:53:50

JavaScript RegExp对象是有状态的。

当正则表达式是全局的时,如果您在相同的正则表达式对象上调用一个方法,它将从索引开始,直到最后一个匹配结束。

当找不到更多的匹配项时,索引将自动重置为0

若要手动重置它,请设置lastIndex属性。

代码语言:javascript
运行
复制
reg.lastIndex = 0;

这可能是一个非常有用的功能。如果需要,可以在字符串中的任何位置开始求值,或者如果在循环中,可以在所需的匹配次数后停止求值。

下面是在循环中使用正则表达式的典型方法的演示。它通过执行赋值作为循环条件来利用这样一个事实,即当不再有匹配时,exec返回null

代码语言:javascript
运行
复制
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/

如果你不喜欢赋值的位置,可以修改循环,例如...

代码语言:javascript
运行
复制
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/

票数 252
EN

Stack Overflow用户

发布于 2012-07-14 03:55:10

来自MDN docs

如果您的正则表达式使用"g“标志,则可以多次使用exec方法在同一字符串中查找连续的匹配项。执行此操作时,搜索将从正则表达式的lastIndex属性指定的字符串的子字符串开始(测试还将推进lastIndex属性)。

因为您使用的是g标志,所以exec将从最后一个匹配的字符串开始,直到它到达末尾(返回null),然后重新开始。

就我个人而言,我更喜欢使用str.match(reg)的另一种方式

票数 26
EN

Stack Overflow用户

发布于 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

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11477415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档