如何使用regexp匹配javascript中的所有重复子字符串?
例如: 通过" abccdddcdcdcdcd123"
获取[ "cd","cd","cdcd","cdcdcd", "cdcdcdcd" ]
+
无效:
"abccdddcdcdcdcd123".match(/(cd)+/g)
Array [ "cd", "cdcdcdcd" ]
答案 0 :(得分:0)
这可以通过积极向前看?=
来完成。这种类型的匹配不会向前移动光标,因此您可以多次匹配相同的内容。
var re = /cd(?=((cd)*))/g;
var str = "abccdddcdcdcdcd123";
var m;
while (m = re.exec(str)) {
console.log(m[0]+m[1]);
}
捕获组0获得第一个cd
,然后正向前瞻捕获所有后续cd
个字符。您可以将两者结合起来以获得所需的结果。
请参阅https://www.regular-expressions.info/refadv.html
匹配前瞻中的图案可以匹配的位置处的匹配。只匹配位置。它不消耗任何字符或扩展匹配。在像一个(?=两个)三个模式中,两个和三个必须在一个匹配的位置匹配。
答案 1 :(得分:0)
我想你也可以这样做。
将捕获组置于先行断言中
大多数发动机如果从那以后没有改变,就会碰到当前的正则表达位置
最后一场比赛不过JS,你必须通过递增lastIndex
手动完成。
可读的正则表达式
(?=
( # (1 start)
(?: cd )+
) # (1 end)
)
var re = /(?=((?:cd)+))/g;
var str = "abccdddcdcdcdcd123";
var m;
while (m = re.exec(str)) {
console.log( m[1] );
++re.lastIndex;
}
答案 2 :(得分:0)
我认为像这样的重叠匹配问题的常见解决方案应该如下:
/(?=((cd)+))cd
在前瞻中匹配组中的内部模式一次或多次,同时在前方移动carret两个字符。 (我们也可以移动两个点..
)。
代码示例:
var re = /(?=((cd)+))cd/g;
var str = "abccdddcdcdcdcd123";
var m; //var arr = new Array();
while (m = re.exec(str)) {
//arr.push(m[1]);
console.log(m[1]);
}

我们通过m[1]
从第1组获得结果
使用.push(m[1]);
将其添加到数组中。