Условное регулярное выражение 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 альтернативы:
один с положительным взглядом-вперед и
второй с обратным, отрицательным взглядом вперед.
это регулярное выражение соответствует вашим критериям и совместимо с 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