正则表达式匹配纠结的表达

时间:2016-02-03 20:21:29

标签: javascript regex

我有这个字符串:

  

abcabca

和这个正则表达式:

/abca/g

这个只匹配第一个abca,但我希望它与第二个匹配。

2 个答案:

答案 0 :(得分:5)

您可以使用前瞻来进行重叠匹配:

/(?=(abca))/g

RegEx Demo

答案 1 :(得分:1)

Anubhava's answer不完整,因为Lucas Trzesniewski mentions /(?=(abca))/g正则表达式需要特定的JS代码才能使用。

如果您在regexr.com测试正则表达式,则会收到警告:

enter image description here

这是因为匹配是一个空字符串,abca值是一个子匹配,一个捕获的文本。为了使正则表达式索引前进,您需要告诉JS继续沿着字符串继续:

var re = /(?=(abca))/g; 
var str = 'abcabca';
var res = [];
while ((m = re.exec(str)) !== null) {
    if (m.index === re.lastIndex) {   // Here we tell the regex
        re.lastIndex++;               // engine to move 
    }                                 // on
    res.push(m[1]);
}
document.body.innerHTML = "<pre>" + JSON.stringify(res, 0, 4) + "</pre>";

请参阅regex101 demo

结论:

  • 使用regex101.com测试您的正则表达式,并使用其代码生成器功能
  • JS多重匹配与Python,PHP和.NET不同,其中re.findallpreg_match_allRegex.Matches将测试字符串中的每个位置(=提升正则表达式索引)他们自己。