Совет вашей команды почти правильный, за исключением допущенной ошибки. Как только вы узнаете почему, вы никогда этого не забудете. Взгляните на эту ошибку.
/^(7|8|9)\d{9}$/
Что это значит:
^
и $
обозначает привязанные совпадения, в котором утверждается, что подшаблон между этими якорями является полным совпадением. Строка будет соответствовать только в том случае, если подшаблон соответствует всему, а не только разделу.
()
обозначает группу захвата .
7|8|9
означает соответствие любой из 7
, 8
или 9
. Он делает это с чередованиями , что и |
делает оператор конвейера - чередование чередований. При этом выполняется возврат между чередованиями: если первое чередование не совпадает, механизм должен вернуться до того, как позиция указателя переместится во время совпадения чередования, чтобы продолжить соответствие следующему чередованию; В то время как класс персонажей может продвигаться последовательно. Посмотрите это совпадение на движке регулярных выражений с отключенной оптимизацией:
Pattern: (r|f)at
Match string: carat
Pattern: [rf]at
Match string: carat
\d{9}
соответствует девяти цифрам. \d
- сокращенный метасимвол, который соответствует любым цифрам.
/^[7|8|9][\d]{9}$/
Посмотрите, что он делает:
^
и также $
обозначает привязанные совпадения.
[7|8|9]
это класс персонажей . Любые символы из списка 7
, |
, 8
, |
, или 9
могут быть подобраны, таким образом, |
был добавлен в неправильно. Это соответствует без возврата.
[\d]
- это класс символов, содержащий метасимвол \d
. Между прочим, сочетание использования класса символов и одного метасимвола - плохая идея, поскольку уровень абстракции может замедлить сопоставление, но это всего лишь деталь реализации и применяется только к нескольким реализациям регулярных выражений. JavaScript не один, но он немного удлиняет подшаблон.
{9}
указывает, что предыдущая единственная конструкция повторяется всего девять раз.
Оптимальное регулярное выражение /^[789]\d{9}$/
, поскольку /^(7|8|9)\d{9}$/
захватывает без необходимости, что приводит к снижению производительности для большинства реализаций регулярных выражений (javascriptявляется одним, учитывая, что вопрос использует ключевое слово var
в коде, вероятно, это JavaScript). Использованиеphpкоторый работает на PCRE для сопоставления preg, оптимизирует отсутствие отслеживания с возвратом, однако мы тоже не на PHP, поэтому использование классов []
вместо чередований |
дает бонус к производительности, поскольку сопоставление не выполняется с возвратом, и, следовательно, как совпадение, так и сбой происходит быстрее, чем использование вашего предыдущее регулярное выражение.
(7|8|9)
и[789]
не эквивалентны, потому что первый захватывает, а второй нет.(?:7|8|9)
было бы эквивалентно с другой стороны (я думаю, вы знаете это, конечно ...).