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