【问题标题】:Regex match letters and numbers, except if there are three consecutive (any) letters正则表达式匹配字母和数字,除非有三个连续的(任意)字母
【发布时间】:2019-01-02 09:01:05
【问题描述】:

我有一个匹配一组数字和字母的正则表达式。但是,我希望能够排除任何三个连续的字母。这是为了防止意外形成单词或缩写。

我的表达如下。它还排除了一些相似的字符,如 0、o、O 和 1、i、I、l):

^[2-9a-hjkmnp-zA-HJ-NP-Z]{4}$

这匹配像 24rQ1234 这样的字符串。但我希望它与2dmv 不匹配。因为,在这种情况下,这可能包含已知的缩写(正或负)。

https://regex101.com/r/bbiQWD/1/

一个麻烦的方法是写出所有的组合。我写了一个速记(包括类似的字符)作为例子。但这不是那么易读或易于解释/维护。

(^\d{4}$)|
(^\d{3}\w$)|
(^\d{2}[\d\w]{2}$)|
(^\d{1}[\d\w]{2}\d{1}$)|
(^\d{1}\w{1}\d{1}\w{1}$)|
(^[\d\w]{2}\d{1}[\d\w]{1}$)|
(^\w{1}\d{1}[\d\w]{2}$)

https://regex101.com/r/bbiQWD/2

有没有更好的方法来查找三个连续的字母?

【问题讨论】:

    标签: javascript regex regex-lookarounds


    【解决方案1】:

    在模式的开头,.?[a-zA-Z]{3} 的负前瞻:

    ^(?!.?[a-zA-Z]{3})[2-9a-hjkmnp-zA-HJ-NP-Z]{4}$
    

    https://regex101.com/r/bbiQWD/4

    【讨论】:

    • 谢谢。我需要重新检查如何使用前瞻。我假设它只会在主题中的确切位置匹配,但我忘记了我可以先匹配任何字符。真聪明。我已经用大写测试更新了你的答案(不是你的原始答案)。 regex101.com/r/bbiQWD/5
    【解决方案2】:

    首先,\d\w 的子集。所以[\d\w]{2} 意味着\w\w\d{3}\w 并不意味着[0-9][a-zA-Z]。毕竟你不需要计算所有的排列。改用环视:

    ^(?!.*[a-zA-Z]{3})[2-9a-hjkmnp-zA-HJ-NP-Z]{4}$
    

    See live demo here

    【讨论】:

    • \d\w 示例只是一个解决方法的演示,并非旨在正确。无论如何,感谢您指出!当然还有正确的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    相关资源
    最近更新 更多