Rada twojego zespołu jest prawie słuszna, z wyjątkiem popełnionego błędu. Kiedy dowiesz się dlaczego, nigdy tego nie zapomnisz. Spójrz na ten błąd.
/^(7|8|9)\d{9}$/
Co to oznacza:
^i $oznacza zakotwiczone dopasowania, co oznacza, że podwzór między tymi kotwicami jest całym dopasowaniem. Ciąg będzie pasował tylko wtedy, gdy podwzór będzie pasował do całości, a nie tylko do sekcji.
()oznacza grupę przechwytującą .
7|8|9oznacza dopasowując jeden z 7, 8lub 9. Robi to z naprzemiennymi zmianami , co |robi operator potoku - naprzemiennie między zmianami. Powoduje to cofanie się między zmianami: Jeśli pierwsza zmiana nie jest dopasowana, silnik musi powrócić, zanim położenie wskaźnika przesunięte podczas dopasowania zmiany, aby kontynuować dopasowywanie następnej zmiany; Podczas gdy klasa postaci może postępować sekwencyjnie. Zobacz to dopasowanie w silniku wyrażeń regularnych z wyłączonymi optymalizacjami:
Pattern: (r|f)at
Match string: carat

Pattern: [rf]at
Match string: carat

\d{9}pasuje do dziewięciu cyfr. \dto skrótowy metaznak, który pasuje do wszystkich cyfr.
/^[7|8|9][\d]{9}$/
Zobacz, co to robi:
^i $oznacza również zakotwiczone dopasowania.
[7|8|9]to klasa postaci . Wszelkie znaki z listy 7, |, 8, |, lub 9mogą być dopasowane, tak więc |dodano niepoprawnie. To pasuje bez cofania.
[\d]to klasa znaków, która zamieszkuje metaznak \d. Nawiasem mówiąc, połączenie użycia klasy znaków i pojedynczego metaznaku jest złym pomysłem, ponieważ warstwa abstrakcji może spowolnić dopasowanie, ale jest to tylko szczegół implementacji i dotyczy tylko kilku implementacji wyrażeń regularnych. JavaScript nie jest jednym z nich, ale sprawia, że podwzór jest nieco dłuższy.
{9} wskazuje, że poprzednia pojedyncza konstrukcja została powtórzona w sumie dziewięć razy.
Optymalnym wyrażeniem regularnym jest /^[789]\d{9}$/, ponieważ /^(7|8|9)\d{9}$/przechwytuje niepotrzebnie, co powoduje spadek wydajności w większości implementacji wyrażeń regularnych (javascripttak się składa, że pytanie używa słowa kluczowego varw kodzie, prawdopodobnie jest to JavaScript). Sposób użyciaphpktóry działa na PCRE dla dopasowania preg, zoptymalizuje brak cofania, jednak nie jesteśmy w PHP, więc używanie klas []zamiast naprzemiennych |daje premię za wydajność, ponieważ dopasowanie nie cofa się, a zatem zarówno mecze, jak i kończą się niepowodzeniem szybciej niż użycie twojego poprzednie wyrażenie regularne.
(7|8|9)i[789]nie są równoważne, ponieważ pierwsze to przechwytywanie, drugie nie.(?:7|8|9)byłoby równoważne z drugiej strony (myślę, że wiesz, że oczywiście ...).