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

时间:2017-05-24 23:37:35

标签: regex regex-negation

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

2 个答案:

答案 0 :(得分: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 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<-不止一次。
  3. 由于两者都处于交替状态,因此这些模式中的任何一个都将匹配。

    对于字符串i7g172w2n,子匹配将为i - 7 - g - 172 - w - 2 - n。符合规范。

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

    同样abc2p73737373超过了长度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