【问题标题】:Javascript Regexp not returning global resultsJavascript Regexp 不返回全局结果
【发布时间】:2010-06-09 04:32:14
【问题描述】:

我的理解是,下面所有这三行都应该返回一个包含 2 个结果的 ARRAY。然而,无论正则表达式在字符串中重复多少次,RegExp 都只会返回 1 个结果。

有人能解释一下原因吗?或许建议我如何让 RegExp 为我提供全局结果?

//INTPUT: 
    console.log(new RegExp("New York", "gi").exec("New York New York")); 

//OUTPUT: 
["New York"]

//INTPUT: 
    console.log(new RegExp(/New York/gi).exec("New York New York"));

//OUTPUT: 
["New York"]

//INTPUT: 
    console.log("New York New York".match(/New York/gi));

//OUTPUT:
["New York", "New York"]

【问题讨论】:

  • 现在真正让我感兴趣的是,如果你尝试(' New York New York ').match(/ New York /gi),它只会带来 1 个结果(正如预期的那样),我想不出更好的方法来解决这个问题(否则需要)other than iterating over it! :(

标签: javascript regex global


【解决方案1】:

您的第三个示例是获取匹配数组的最佳方法。

RegExp.exec 实际上会记住它的位置,并在后续调用中返回下一个结果:

>>> var v = /new york/gi
>>> v.exec("NEW YORK new york")
["NEW YORK"]
>>> v.exec("NEW YORK new york")
["new york"]
>>> v.exec("NEW YORK new york")
null

【讨论】:

  • 你可以利用它自己构建一个数组,但调用 string.match 会更容易
  • 我有一个关键字数组,我试图计算字符串中出现的次数。最好的方法是什么?
【解决方案2】:

这是意料之中的,exec() 返回单个匹配,但提供的匹配信息比 match() 更多。如果您只想要所有匹配项,请使用 match()。来自JavaScript: The Definitive Guide

回想一下 match() 返回一个数组 通过全局匹配时的匹配数 正则表达式。执行(),通过 相反,总是返回一个 匹配并提供完整的 关于那场比赛的信息。什么时候 exec() 被定期调用 具有 g 标志的 epression,它设置 匹配的 lastIndex 属性 子串。当 exec() 被调用时 第二次为同一个常规 表达式,它开始搜索 所指示的字符位置 lastIndex 属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多