Как создать Regex для фильтрации результатов с несколькими сложными условиями, касающимися длины, регистра и классов символов - PullRequest
0 голосов
/ 23 октября 2019

У меня отфильтровано следующее:

  • 2 цифры (?=..*\d)
  • 2 заглавных буквы (?=..*[a-z])
  • 2 строчных буквы (?=..*[A-Z])
  • от 10 до 63 символов .{10,63}$

Что означает:

(?=.{2,}\d)(?=..*[a-z])(?=..*[A-Z]).{10,63}

Затем я хочу исключить слово, начинающееся с буквы u и заканчивающееся от трех дошесть цифр:

([uU][0-9]{3,6})

Однако, как я могу объединить эти два шаблона, чтобы сделать следующее:

Это не должно позволять следующее, потому что соответственно:

# does not have the required combination of characters
aaaaaaaaaaaaaaa

# is too long
asadsfdfs12BDFsdfsdfdsfsdfsdfdsfdsfdfsdfsdfsdfsdsfdfsdfsdfssdfdfsdfssdfdfsdfssdfdfsdfsdfsdfsdfsfdsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfs

# contains the pattern that shouldn't be allowed
U0000ABcd567890
ABcd56U00007890
D4gF3U432234
D4gF3u432234
ABcd567890U123456

должно позволять следующее:

# it has the required combination of characters
ABcd5678990
ABcd567890

# does contain a part of the disallowed pattern (`([uU][0-9]{3,6})`), but does not fit that pattern entirely
ABcd567890U12
ABcd5U12abcdf
s3dU00sDdfgdg
ABcd56U007890

Создан и пример здесь: https://regex101.com/r/4b2Hu9/3

Ответы [ 2 ]

2 голосов
/ 23 октября 2019

В вашем паттерне вы используете взгляд (?=..*\d), значение которого отличается от того, что вы предполагаете.

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

Вы можете обновить свойшаблон для:

^(?!.*[uU]\d{3,6})(?=(?:\D*\d){2})(?=(?:[^a-z]*[a-z]){2})(?=(?:[^A-Z]*[A-Z]){2}).{10,63}$

По частям

  • ^ Начало строки
  • (?!.*[uU]\d{3,6}) Отрицательный взгляд вперед, не утверждать u или Uс последующими 3-6 цифрами
  • (?=(?:\D*\d){2}) Подтверждение 2 цифры
  • (?=(?:[^a-z]*[a-z]){2}) Подтверждение 2 строчных букв
  • (?=(?:[^A-Z]*[A-Z]){2}) Подтверждение 2 прописных букв
  • .{10,63} Соответствует любому символу, кроме новой строки 10-63 раза
  • $ Конец строки

Regex demo

0 голосов
/ 23 октября 2019

Во-первых, способ обеспечения того, чтобы строка содержала, например, две цифры, состоял в том, чтобы использовать положительный прогноз:

(?=.*\d.*\d)

Вы можете обобщить это для других ваших фильтров.

Чтобы убедиться, что строка содержит от 10 до 63 символов:

.{10,63}

Вы говорите, что не хотите, чтобы строка начиналась с u или U, а затем от 3 до 6 цифр (допустимо до 7 цифр), используйтенегативный взгляд:

(?![uU]\d{3,6}\D)

\D требуется, чтобы убедиться, что если есть седьмая цифра, то строка будет принята.

Собираем все вместе:

r'^(?=.*\d.*\d)(?=.*[a-z].*[a-z])(?=.*[A-Z].*[A-Z])(?![uU]\d{3,6}\D).{10,63}$'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...