Условное регулярное выражение Javascript if-then-else

Я пытаюсь ограничить записи определенным форматом.

Если запись имеет 5500 или 5100, такие как 011-5500-000-00, то я хочу иметь это:

^[0-9]{2,}[0-9]{2}-[0-9]{4}-[0-9]{3}-$

но если запись имеет что-нибудь, кроме 5500 или 5100, я хочу иметь это:

^[0-9]{2,}[0-9]{2}-[0-9]{4}-[0-9]{3}-[0-9]{2}$

Как это можно сделать с идеей if then else?

3 ответов


условный синтаксис регулярных выражений не поддерживается JavaScript regex engine, но его можно обойти с группой без захвата, содержащей 2 альтернативы:

  1. один с положительным взглядом-вперед и

  2. второй с обратным, отрицательным взглядом вперед.

это регулярное выражение соответствует вашим критериям и совместимо с JavaScript:

^(?:(?=.*\b5[15]00\b)[0-9]{2,}\[0-9]{2}-[0-9]{4}-[0-9]{3}-|(?!.*\b5[15]00\b)[0-9]{2,}\[0-9]{2}-[0-9]{4}-[0-9]{3}-[0-9]{2})$

посмотреть регулярное выражение демо

позвольте мне разбить его:

  • ^ - начало строки
  • (?:
    • (?=.*\b5[15]00\b)[0-9]{2,}\[0-9]{2}-[0-9]{4}-[0-9]{3}- - первая альтернатива с (?=.*\b5[15]00\b) смотрите вперед, что требует целого слова 5500 или 5100 внутри строки, и первый шаблон у вас есть
    • | - оператор чередование
    • (?!.*\b5[15]00\b)[0-9]{2,}\[0-9]{2}-[0-9]{4}-[0-9]{3}-[0-9]{2}) - вторая альтернатива, которая добавляется с (?!.*\b5[15]00\b) отрицательный просмотр вперед, что убедитесь, что нет 5100 или 5500 внутри строки, и только тогда соответствует вторая модель.
  • $ - конец строки.

заменить эту часть шаблона [0-9]{4} С литеральными значениями для 5100/5500:

/^\d{2,}\\d{2}-(?:5[15]00-\d{3}-|(?!5[15]00)\d{4}-\d{3}-\d{2})$/
  • [0-9] это то же самое как \d в JavaScript
  • для остальной части используйте отрицательный lookahead (?!5[15]00)\d{4} гарантировать, что это не 5100/5500.

использовать условия, например:

(?(?=regex) тогда / else): [0-9]{2,}\[0-9]{2}\-(?(?=5[15]00)[0-9]{4}\-[0-9]{3}\-|[0-9]{4}\-[0-9]{3}\-[0-9]{2})

regex conditionals пример:conditionals@regex101.com

В случае, если вы используете регулярное выражение двигатель это не на основе PCRE, вы можете быть в состоянии имитировать функциональность, делая следующее:

((?=positive-regex-statement)then|(?!negavite-regex-statement)then)

например.

^[0-9]{2,}\[0-9]{2}\-((?=5[15]00)[0-9]{4}\-[0-9]{3}\-|[0-9]{4}\-|(?!5[15]00)[0-9]{4}\-[0-9]{3}\-[0-9]{2})$

пример условных выражений MIMIC regex: mimic@regex101.com