匹配所有连续数量的长度n

时间:2017-02-24 16:11:13

标签: regex

我的例子中n = 4。

我对Regex很新,现在已经搜索了20分钟。有一些有用的网站简化了一些事情,但我无法解决如何继续这样做。

我希望从中提取4个连续数字的每个组合:

12345

得到:

1234 - possible with ^\d{4}/g  - Starts at the beginning
2345 - possible with  \d{4}$/g - Starts at the end

但我无法兼得!输入可以是任何长度。

3 个答案:

答案 0 :(得分:2)

您的表达式未按预期工作,因为这两个子字符串重叠。

除了零长度断言之外,输入字符串中的任何字符都将在匹配过程中使用,这会导致找不到重叠匹配。

您可以通过使用前瞻和捕获组来检索重叠匹配来解决此问题。这是有效的,因为前瞻断言(以及后向断言)被归类为零长度断言,这意味着它们不消耗匹配;从而允许您找到任何重叠的匹配。

(?=(\d{4}))

以下是一个快速代码段,展示了这一点:

var regex = /(?=(\d{4}))/g;
var input = '12345678';
var match;

while ((match = regex.exec(input)) !== null) {
    if (match.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    console.log(match[1]);
}

答案 1 :(得分:1)

您可以使用带有捕获组的前瞻:

(?=(\d{4}))

请参阅demo

答案 2 :(得分:0)

使用具有所有可能性的前瞻断言 (?=(0123|1234|2345|3456|4567|5678|6789))

 (?=
      (                             # (1 start)
           0123
        |  1234
        |  2345
        |  3456
        |  4567
        |  5678
        |  6789 
      )                             # (1 end)
 )

输出

 **  Grp 0 -  ( pos 0 , len 0 )  EMPTY 
 **  Grp 1 -  ( pos 0 , len 4 ) 
1234  

------------------

 **  Grp 0 -  ( pos 1 , len 0 )  EMPTY 
 **  Grp 1 -  ( pos 1 , len 4 ) 
2345