2017-02-24 48 views
2

其中n = 4在我的例子中。匹配所有连续数字的长度n

我对Regex很新,现在已经搜索了20分钟。有一些有用的网站可以简化事情,但我无法解决如何进行此操作。

我要连续4个数字的每个组合由该提取:

12345 

获得:

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

但我不能两全!输入可以是任意长度。

回答

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]); 
 
}

+0

谢谢你的详细解释。我只是问[这个问题](http://stackoverflow.com/questions/42456201/what-should-the-javascript-match-regex-function-return),因为我很难返回比赛。你对零长度的评价已经超出了我的头脑,但也许可以解释为什么我会得到奇怪的结果。编辑:我应该澄清,我没有使用你的代码,因为它导致无限循环出于某种原因。 – DaveHolt

1

您可以使用一个超前与捕获组:

(?=(\d{4})) 

demo

0

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

(?= 
     (       # (1 start) 
     
     | 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 
+0

虽然这确实有效,但它假设我们事先知道所有可能的结果。在我的情况下,输入可能是随机/不可预测的。 – DaveHolt

+0

@DaveHolt - 嘿伙伴,我假设'连续4位数字的每个组合'表示相邻数字是字符+/- 1的代码。否则,与术语_combination_一起使用时_consecutive_没有特殊含义。它只是一个字符类'[0-9]'如果你想在描述中加入_unique_,那是完全不同的。 – sln

+0

此外,只是一个评论。所有这些答案都使用重叠搜索。这并不是什么新东西,但它的方法论很少被理解或描述。 – sln

相关问题