如何在多个匹配的JavaScript RegEx中仅返回捕获的组

时间:2014-03-22 18:49:47

标签: javascript regex

简化示例:

/not(?:this|that)(.*?)end/ig.exec('notthis123end notthat45end')

返回

["notthis123end", "123"]

我正在拍摄

["123", "45"]

我所知道的就是把RE放在一个RegExp对象中并围绕exec运行一个while循环,这似乎有点傻,或者使用match,但是回到整个比赛,而不仅仅是被捕获的部分。

1 个答案:

答案 0 :(得分:20)

您的RegEx似乎工作正常。问题在于对输出的解释。

  1. 要获得RegEx的多个匹配项,您应该这样做

    var regEx = /not(?:this|that)(.*?)end/ig;
    var data  = "notthis123end notthat45end";
    var match = regEx.exec(data);
    
    while(match !== null) {
        console.log(match[1]);
        match = regEx.exec(data);
    }
    

    注意:将RegEx存储在这样的变量中非常重要,并使用循环。因为,为了获得多个匹配,JavaScript RegEx实现,将匹配的当前索引存储在RegEx对象本身中。因此,下次exec被调用时,它会从它离开的地方开始。如果我们按原样使用RegEx文字,那么我们将以无限循环结束,因为它将始终从头开始。

  2. result of exec方法必须像这样解释,第一个值是整个匹配,然后是下一个元素,我们得到匹配内的组。在本RegEx中,我们只有一个组。因此,我们使用match[1]

  3. 进行访问