Совет вашей команды почти правильный, за исключением допущенной ошибки. Как только вы узнаете почему, вы никогда этого не забудете. Взгляните на эту ошибку.
/^(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)было бы эквивалентно с другой стороны (я думаю, вы знаете это, конечно ...).