匹配连续 n(字母数字)的正则表达式

Regex to match consecutive n (alpha numeric)

我正在尝试匹配字符串中连续的 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 不工作。

虽然几乎可以肯定有针对此问题的纯正则表达式解决方案,但这将是一个涉及前瞻断言的难以理解的混乱局面。如果你用代码而不是正则表达式来做一些工作,问题就会变得更加简单(显示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

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

正则表达式: ^(?:(?:\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 Digit 1-3 Alphabets 1-3 Digits ) <- 不止一次.
  2. (?:[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