我正在尝试匹配字符串中的连续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 :(得分:1)
尝试使用以下正则表达式。
正则表达式: ^(?:(?:\d{0,3}[a-z]{1,3}\d{1,3})+|(?:[a-z]{0,3}\d{1,3}[a-z]{1,3})+)$
说明:基本上我所做的是匹配以下模式。
(?:\d{0,3}[a-z]{1,3}\d{1,3})+
0-3 Digit
1-3 Alphabets
1-3 Digits
)<-
不止一次。 (?:[a-z]{0,3}\d{1,3}[a-z]{1,3})+
0-3 Alphabets
1-3 Digits
1-3 Alphabets
)<-
不止一次。由于两者都处于交替状态,因此这些模式中的任何一个都将匹配。
对于字符串i7g172w2n
,子匹配将为i
- 7
- g
- 172
- w
- 2
- n
。符合规范。
对于字符串adsb172cd
,子匹配将为adsb
- 172
- cd
。由于adsb
超过了长度3.因此不会匹配。
同样abc2p7373
,7373
超过了长度3。
的 Regex101 Demo 强>
答案 1 :(得分: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