2017-05-24 104 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 
相關問題