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|9
oznacza dopasowując jeden z 7
, 8
lub 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. \d
to 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 9
mogą 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 var
w 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 ...).