Регулярное совпадение букв и цифр, кроме трех последовательных (любых) букв - PullRequest
0 голосов
/ 02 января 2019

У меня есть регулярное выражение, которое соответствует набору цифр и букв.Однако я хотел бы иметь возможность исключить любые три последовательных письма.Это сделано для предотвращения случайного формирования слов или сокращений.

У меня есть следующее выражение.Также исключаются некоторые похожие символы, такие как 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

Есть ли лучший способ искать три последовательных буквы?

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Перво-наперво, \d - это подмножество \w.Таким образом, [\d\w]{2} означает \w\w или \d{3}\w не означает [0-9][a-zA-Z].В конце концов вам не нужно рассчитывать все перестановки.Вместо этого используйте lookarounds:

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

Смотрите демонстрацию здесь

0 голосов
/ 02 января 2019

В начале паттерна, отрицательный взгляд на .?[a-zA-Z]{3}:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...