Сложное регулярное выражение для соответствия дефисам и цифрам FOO - PullRequest
1 голос
/ 14 марта 2019

Мы пытаемся создать регулярное выражение, которое должно соответствовать следующим строкам:

  • FOO-123123123123
  • FOO123123123123
  • FOO-123-123-123-123

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

  • строка должна начинаться с символов FOO
  • после того, как foo может быть только дефисом (опционально)и числа
  • не может быть более одного дефиса в строке
  • вся длина строки не может быть более 50 символов и менее 6

Мы уже придумали что-то вроде этого

^FOO(-{0,1}[\d]+){6,50}$

, но {6,50} устанавливает ограничение в 50 не для общей длины строки, а для повторов этой группы захвата

(-{0,1}[\d]+)

Можете ли вы дать совет?

Ответы [ 2 ]

3 голосов
/ 14 марта 2019

Вы можете использовать

^(?=.{6,50}$)FOO-?\d+(?:-\d+)*$

См. Демоверсию regex .

Детали

  • ^ - начало строки
  • (?=.{6,50}$) - длина строки должна быть от 6 до 50 символов
  • FOO - подстрока FOO
  • -? - опционально -
  • \d+ - 1+ цифр
  • (?:-\d+)* - 0 или более повторений -, а затем 1+ цифр
  • $ - конец строки.

Примечание: \d может соответствовать больше, чем цифры ASCII , если вас это беспокоит, скомпилируйте регулярное выражение с параметром RegexOptions.ECMAScript или замените \d на [0-9].

Кроме того, ^(?=.{6,50}$)FOO(?:-?\d+)*$ также будет работать и короче, но нецелесообразно использовать один обязательный шаблон с другими дополнительными шаблонами внутри количественной группы. В этом конкретном случае это нормально, но в других ситуациях следование этой логике может привести к катастрофическому откату назад.

0 голосов
/ 14 марта 2019

Вы можете использовать предпросмотр для правил проверки конкретных символов и «нормальное» выражение для общей длины.

^FOO(?=(?:-?\d+)+$)[-\d]{3,47}$

Буква FOO является литералом, и она должна быть началомстрока.Следующий блок - заглядывание ((?=...)).Это проверяет последующую строку на предмет отсутствия смежных дефисов, а только цифр.Предварительный просмотр не потребляет, поэтому после его завершения двигатель все еще смотрит на конец «FOO».Последний бит выражения указывает на то, что единственными символами, которые следуют за «FOO», являются дефисы или цифры, а максимальный размер составляет от 3 до 47, что составляет максимум 6–50 (за вычетом длины «FOO»).).

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