如何使用regexp匹配javascript中的所有重复子字符串?

时间:2018-06-04 21:59:57

标签: javascript regex

如何使用regexp匹配javascript中的所有重复子字符串?

例如: 通过" abccdddcdcdcdcd123"

获取[ "cd","cd","cdcd","cdcdcd", "cdcdcdcd" ]

+无效:

"abccdddcdcdcdcd123".match(/(cd)+/g)
Array [ "cd", "cdcdcdcd" ]

3 个答案:

答案 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]);将其添加到数组中。