【问题标题】:RegExp.exec not returning global resultsRegExp.exec 不返回全局结果
【发布时间】:2010-10-13 00:33:56
【问题描述】:

根据 MDC https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/RegExp/exec,以下代码应记录此正则表达式的每个全局匹配项。

var str = "(^|\\+)(1\\+1)($|\\+)";
var regex = new RegExp(str, "g");
var result;
var testString = "1+1+1";
while ((result = regex.exec(testString)) != null)
{
    console.log(result);
}

但我得到的只是第一场比赛,然后循环结束。任何想法为什么。

【问题讨论】:

    标签: javascript regex exec


    【解决方案1】:

    只有一个匹配项,因为不允许重叠。比赛是:

    (^|\\+) - ^
    
    (1\\+1) - 1+1
    
    ($|\\+) - +
    

    应该清楚不能再匹配,因为每个匹配至少需要1+1,并且只剩下一个 1。作为单独的说明,使用正则表达式文字更简单:

    var regex = /(^|\+)(1\+1)($|\+)/g;
    

    【讨论】:

    • 我没有意识到全局匹配不能重叠。反正我可以得到与正则表达式匹配的重叠匹配吗?
    • 除了在testString.substring(0)testString.substring(1) 等上运行它的明显(低效)方法之外,我不知道其他方法。
    • 很遗憾,因为我不得不使用嵌套循环来解决实际上比问题中的简化示例更复杂的情况),尽管它仍然是一项非常简单的任务,而且我认为是正则表达式非常适合。
    【解决方案2】:

    您的正则表达式不会多次匹配该字符串,因为匹配项不能重叠。您是否有另一个要匹配的示例字符串,或者您需要从字符串中获取的更多详细信息?

    无论如何,我会使用 RegExp 对象字面量来代替;少转义,可以直接指定全局标志。

    var regex = /(^|\+)(1\+1)($|\+)/g;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 2016-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多