正则表达式匹配不输出相邻的匹配javascript

时间:2018-06-16 09:21:33

标签: javascript regex

我在javascript中试验正则表达式。然后我遇到了一个问题,让我们考虑字符串str = "+d+a+",我试图输出字符串中被+包围的那些字符,我使用str.match(/\+[a-z]\+/ig),所以我在这里我期待的是["+d+","+a+"],但我得到的只是["+d+"]"+a+"未在输出中显示。为什么呢?

2 个答案:

答案 0 :(得分:1)

.match(/.../g)返回所有非重叠匹配。您的正则表达式每边需要+个符号。给定目标字符串:

+d+a+
^^^
  ^^^

您的匹配必须在中间重叠才能返回"+a+"

您可以使用前瞻和手动循环来查找重叠匹配:



var str = "+d+a+";

var re = /(?=(\+[a-z]\+))/g;

var matches = [], m;
while (m = re.exec(str)) {
    matches.push(m[1]);
    re.lastIndex++;
}

console.log(matches);




答案 1 :(得分:0)

使用正则表达式,当一个角色被匹配消耗时,它将不计入下一个匹配。

例如,像/aba/g这样的正则表达式在“ababa”之类的字符串中找不到2个aba。 因为第二个“a”已被消耗 但是,使用积极的前瞻(?=...)可以克服这一点 因为前瞻只是在没有实际消费的情况下检查背后的内容 因此像/(ab)(?=(a))/g这样的正则表达式会为每个'aba'返回2个捕获组,其中包含'ab'和'a'。

但在这种情况下,只需要跟着1个固定字符'+' 所以它可以简化,因为你真的不需要这个捕获组。

示例摘录

var str = "+a+b+c+";

var matches = str.match(/\+[a-z]+(?=\+)/g).map(function(m){return m + '+'});

console.log(matches);