正则表达式匹配字母和数字,除非连续三个(任意)字母

时间:2019-01-02 09:01:06

标签: javascript regex regex-lookarounds

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

我的表达式如下。它还排除了一些类似的字符,例如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

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

2 个答案:

答案 0 :(得分:4)

在模式的开头,对.?[a-zA-Z]{3}的否定超前查询:

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

https://regex101.com/r/bbiQWD/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}$

See live demo here