我有一个正则表达式,可以匹配一组数字和字母。但是我希望能够排除任何三个连续字母。这是为了防止意外形成单词或缩写。
我的表达式如下。它还排除了一些类似的字符,例如0,o,O和1,i,I,l):
^[2-9a-hjkmnp-zA-HJ-NP-Z]{4}$
这匹配诸如24rQ
和1234
之类的字符串。但我希望它不匹配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
是否有更好的方法来查找三个连续的字母?
答案 0 :(得分:4)
在模式的开头,对.?[a-zA-Z]{3}
的否定超前查询:
^(?!.?[a-zA-Z]{3})[2-9a-hjkmnp-zA-HJ-NP-Z]{4}$
答案 1 :(得分:0)
首先,\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}$