Поради вашої команди майже правильні, за винятком помилки, яка була допущена. Як тільки ви дізнаєтеся чому, ви ніколи цього не забудете. Погляньте на цю помилку.
/^(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 для відповідності прег, оптимізує відсутність зворотного відстеження, однак ми також не в PHP, тому використання класів []замість чергувань |дає бонус за ефективність, оскільки збіг не відступає, і тому обидва збіги та виходять з ладу швидше, ніж використання попередній регулярний вираз.
(7|8|9)і[789]не є рівнозначними, бо перше захоплює, друге - ні.(?:7|8|9)З іншого боку, це було б рівнозначно (я думаю, ви це знаєте, звичайно ...).