【问题标题】:Weird behavior with String#match() capturing groupsString#match() 捕获组的奇怪行为
【发布时间】:2014-01-21 18:20:49
【问题描述】:

问题:我有一个字符串,例如:"to see to be to read",我想捕捉 3 个动词 没有“to”前缀,在这种情况下: beseeread

在 Regex 101 上,我尝试了 this really simple regex 并解决了问题:

正则表达式/to (\w+)/g
结果: ['be', 'see', 'read']

出于好奇,我使用正向前瞻方式制作了this another regex,结果是一样的。

正则表达式/(?=to \w+)\w+ (\w+)/g
结果: ['be', 'see', 'read']

好的。奇怪的是:当我在 Browser Console(Chrome 或 Firefox)上运行这个正则表达式时,结果是不同的。以下两次尝试给了我相同的结果:所有三个组包括 to 前缀。

> 'to be to see to read'.match(/to (\w+)/g)
  ["to be", "to see", "to read"]

> 'to be to see to read'.match(/(?=to \w+)\w+ (\w+)/g)
  ["to be", "to see", "to read"]    

我是在这里遗漏了什么还是踩到了错误?

免责声明:这不是家庭作业,我只是在验证一个更大的问题。我不是正则表达式专家,但知道一两件事。

编辑:我想我被 Regex101 愚弄了。它给我的代码示例显示了String#match() 方法,但此函数不会在结果组中相应地排除正则表达式组。循环遍历RegExp#exec() 匹配是要走的路!

【问题讨论】:

    标签: javascript regex capturing-group


    【解决方案1】:

    在 Javascript 中捕获组的正确方法是在 while 循环中使用 RegExp#exec 方法:

    var re = /to (\w+)/g,
        matches = [],
        input = "to see to be to read";
    while (match = re.exec(input))
       matches.push(match[1]);
    
    console.log(matches);
    //=> ["see", "be", "read"] 
    

    【讨论】:

    • 嗯...我明白了。所以我认为剩下的问题是:为什么String#match() 没有按预期工作?
    • 它按预期工作,它只是返回满足匹配的子字符串。就像 anubhava 所说,.exec() 方法是您检索捕获组的方式。
    • @EvertonAgner: String#match 不会像 PHP 的 preg_match_all 这样返回所有捕获的组。另请参阅此问答:stackoverflow.com/questions/432493/…
    • 哦,我明白了,我依赖它。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    相关资源
    最近更新 更多