Oto wyrażenie regularne, które utworzyłem do użycia w JavaScript:
var reg_num = /^(7|8|9)\d{9}$/
Oto kolejny zasugerowany przez członka mojego zespołu.
var reg_num = /^[7|8|9][\d]{9}$/
Zasada polega na sprawdzeniu numeru telefonu:
- Powinien zawierać tylko dziesięć cyfr.
- Pierwsza liczba powinna być dowolną z 7, 8 lub 9.
(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 ...).[<<|>>|\]\]|\[\[]
. Ze względu na kontekst wiem, że wyrażenie regularne próbuje dopasować<<
lub>>
lub[[
lub]]
. Ale z tego, co powiedziałeś, powinno pasować<
lub>
lub[
lub]
. Jeśli użyjesz|
między[]
, czy nawiasy zachowują się inaczej?|
w klasie znaków[...]
, chyba że chcesz dopasować samą kreskę . Również powielanie znaków w klasie znaków nie daje żadnego efektu - klasa postaci to lista znaków, która będzie pasować dokładnie do jednego z nich. Domyślam się, że chcesz mieć grupę , która używa normalnych okrągłych nawiasów:(<<|>>|\]\]|\[\[)
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.
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 z7
,8
lub9
. 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:\d{9}
pasuje do dziewięciu cyfr.\d
to skrótowy metaznak, który pasuje do wszystkich cyfr.Zobacz, co to robi:
^
i$
oznacza również zakotwiczone dopasowania.[7|8|9]
to klasa postaci . Wszelkie znaki z listy7
,|
,8
,|
, lub9
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 kluczowegovar
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.źródło
Pierwsze 2 przykłady działają zupełnie inaczej, jeśli zastępujesz je czymś. Jeśli pasujesz w tym:
zastąpiłbyś 7, 8 lub 9 pustym ciągiem.
Jeśli pasujesz do tego
można wymienić
7
lub8
lub9
lub pionowego BAR !!!! przez pusty ciąg.Po prostu odkryłem to na własnej skórze.
źródło
|
).