2017-05-24 107 views
1

我想匹配字符串中的连续n(字母数字)字符。正则表达式匹配连续n(字母数字)

其中n = 3

i7g172w2n    YES (it has 3 consecutive number) 

adab172cd    NO (it has 4 consecutive alpha even though it has 3 consecutive number) 

aaa172afa    YES (it has 3 consecutive number and 3 consecutive alpha) 

ab21cd172    YES 

abc21a3d3    YES 

能有人帮助我。

这是我的正则表达式:(\D(\d{3})\D)|\d([a-z]{3})\d无法正常工作。

+0

所有有3个连续的字母数字字符。你的意思是 - 只有在正好有3个字母字符或3位数字,或两者都有匹配的情况下,才匹配,但是都不应该有超过3个相同类型的连续字符? – zwer

+0

这是正确的“如果只有3个字符或3位数字,或两者,但都不应该有超过3个相同类型的连续字符”谢谢纠正。 –

+0

@JamesSapam:你在用什么语言? – Rahul

回答

1

请尝试使用以下正则表达式。

正则表达式:^(?:(?:\d{0,3}[a-z]{1,3}\d{1,3})+|(?:[a-z]{0,3}\d{1,3}[a-z]{1,3})+)$

说明:基本上我做的是匹配以下模式。

  1. (?:\d{0,3}[a-z]{1,3}\d{1,3})+

    • 0-3 Digit1-3 Alphabets1-3 Digits<-超过一次。
  2. (?:[a-z]{0,3}\d{1,3}[a-z]{1,3})+

    • 0-3 Alphabets1-3 Digits1-3 Alphabets<-超过一次。

由于两者都以交替的,因此这两种模式的将被匹配。

对于字符串i7g172w2n次比赛将是i - 7 - g - 172 - w - 2 - n。这符合规格。

对于字符串adsb172cd子匹配将是adsb - 172 - cd。由于adsb超过长度3.因此不会匹配。

类似地,对于abc2p73737373超过长度3。

的你的例子Regex101 Demo

+0

abc2p7373怎么样?它不应该匹配正确 –

+0

@JamesSapam:展望它。 – Rahul

+0

和a11111111也匹配哪个不应该? –

0

虽然这个问题几乎可以肯定是一个纯粹的正则表达式解决方案,但它将成为一个涉及前瞻断言的难以理解的混乱。如果你做了一些代码,而不是正则表达式的工作,这个问题变得更加简单(如图所示的Python):

import re 

def consecutive(s, n): 
    matches = re.findall("\d+|[a-z]+", s) 
    longest = max(map(len, matches)) 
    return longest == n 

for test in ["i7g172w2n", "adab172cd", "aaa172afa", "ab21cd172", "abc21a3d3", "12a3b3b3b"]: 
    print test, consecutive(test, 3) 

基本上,它验证的数字或字母的最长连续序列是完全相同的所需数量,不多也不少。输出:

i7g172w2n True 
adab172cd False 
aaa172afa True 
ab21cd172 True 
abc21a3d3 True 
12a3b3b3b False 
相关问题