代码之家  ›  专栏  ›  技术社区  ›  a_guest

用固定的总长度匹配两个连续的序列

  •  0
  • a_guest  · 技术社区  · 6 年前

    我想匹配所有以1到4(小写)字母开头,后跟1到4位数字的字符串,并且该序列的总长度(字母+数字)应为5。字母和数字不得混合。然而,实际的字符串要长得多,这个5序列后面没有任何明显的单词边界(后面可以是 [a-z0-9] 例如)。然而,所讨论的正则表达式应该只与前5个字符有关。

    • 阳性匹配: a1111 , aa111 , abc12def , abc12345 , ...
    • 阴性匹配: a1a1a , aa11a aa11 , 1aaaa x , ...

    所以我需要 ^([a-z]{1,4})[0-9]{5 - length of \1}

    This question 似乎有点关联,但我不知道如何使第二组的长度依赖于第一组。 This answer 建议对所有可能的角色进行展望,但不能防止混淆。

    我不想只对字符串的前五个字符执行匹配(然后检查实际匹配的长度),因为我想扩充这个正则表达式,以便用其他模式匹配字符串的其余部分。

    具体来说,我使用的是python3.6,但我很高兴解决方案也考虑了其他regex风格。

    2 回复  |  直到 6 年前
        1
  •  2
  •   ctwheels    6 年前

    您可以使用以下方法 不得不做交替。

    See regex in use here

    \b[a-z]{1,4}\d{1,4}(?<=\b[a-z\d]{5})
    
    • \b 在单词边界处断言位置
    • [a-z]{1,4} 匹配1到4倍之间的小写字母
    • \d{1,4} 匹配1到4倍之间的数字
    • (?<=\b[a-z\d]{5})
        2
  •  1
  •   wp78de    6 年前

    正则表达式不能计数,您需要使用如下替换:

    \b([a-z][0-9]{4}|[a-z]{2}[0-9]{3}|[a-z]{3}[0-9]{2}|[a-z]{4}[0-9])\b
    

    Regex Demo