Jeśli uruchomię to:
/([^\/]+)+/g.exec('/a/b/c/d');
Rozumiem:
["a", "a"]
Ale jeśli uruchomię to:
'/a/b/c/d'.match(/([^\/]+)+/g);
Wtedy otrzymuję oczekiwany wynik tego:
["a", "b", "c", "d"]
Co za różnica?
javascript
regex
Justin Warkentin
źródło
źródło
exec
aby uzyskać wszystkie pod-selekcje.+
nie jest potrzebne, ponieważmatch
zwróci już wszystkie wyrażenia podrzędne..exec
zwraca tylko jeden za każdym razem, więc to też nie jest potrzebne+
.Odpowiedzi:
exec
z globalnym wyrażeniem regularnym ma być używane w pętli, ponieważ nadal pobiera wszystkie dopasowane wyrażenia podrzędne. Więc:String.match
robi to za Ciebie i odrzuca przechwycone grupy.źródło
while(match = /[^\/]+/g.exec('/a/b/c/d')
bo inaczej utworzy to nieskończoną pętlę !. Jak wyraźnie stwierdzono w MDN developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ ...new RegExp("pattern")
i/pattern/
oznaczało różne rzeczy.Jedno zdjęcie jest lepsze, wiesz ...
Zobacz różnicę?
źródło
/regex/.exec()
zwraca tylko pierwsze znalezione dopasowanie, natomiast"string".match()
zwraca je wszystkie, jeśli użyjeszg
flagi w wyrażeniu regularnym.Zobacz tutaj: exec , match .
źródło
Jeśli twoje wyrażenie regularne jest globalne i przechwytujesz, musisz użyć exec. Mecz nie zwróci wszystkich zdobytych punktów.
Dopasowywanie świetnie sprawdza się podczas dopasowywania (nie do przechwytywania). Uruchamiasz go raz i daje tablicę wszystkich dopasowań. (chociaż jeśli wyrażenie regularne nie jest globalne, dopasowanie pokaże dopasowanie, po którym nastąpi przechwycenie)
Exec jest tym, czego używasz podczas przechwytywania i za każdym razem, gdy jest wykonywany, daje dopasowanie, a następnie przechwytywanie. (dopasowanie będzie zachowywać się w sposób zapewniający pełne dopasowanie, po którym nastąpi przechwycenie, tylko wtedy, gdy wyrażenie regularne nie jest globalne).
Innym zastosowaniem z Exec, jest pobranie indeksu lub pozycji dopasowania. Kiedy masz zmienną dla swojego wyrażenia regularnego, możesz użyć .lastIndex i uzyskać pozycję dopasowania. Obiekt regex ma .lastIndex, a obiekt regex jest tym, co robisz .exec. Dopasowywanie kropek jest wykonywane na łańcuchu i nie będzie można wtedy wykonać obiektu regex dot lastIndex
Łańcuch ma funkcję dopasowania, do której przekazywane jest wyrażenie regularne. A regex ma funkcję exec i jest przekazywany ciąg
exec, uruchamiasz wiele razy. dopasować biegasz raz
Dobrze jest użyć dopasowania, gdy nie przechwytujesz, a podczas przechwytywania możesz użyć exec, które jest potężniejsze, ponieważ jest dobre do przechwytywania, ale jeśli użyłeś dopasowania podczas przechwytywania, zobacz, że pokazuje przechwytywania, gdy wyrażenie regularne nie jest globalne, ale tak nie jest nie pokazuje ujęć, gdy wyrażenie regularne jest globalne.
Inną rzeczą jest to, że jeśli używasz exec, uwaga, która jest wywoływana na wyrażeniu regularnym, to jeśli użyłeś zmiennej dla tego wyrażenia regularnego, masz większą moc
Nie otrzymujesz dopasowań, jeśli nie używasz zmiennej dla wyrażenia regularnego, więc użyj zmiennej dla wyrażenia regularnego, gdy używasz exec
Za pomocą exec możesz uzyskać „indeks” dopasowania
Więc jeśli chcesz indeksować lub przechwytywać, użyj exec (pamiętaj, że jak widzisz, z "indeksem", "indeks", który podaje, jest tak naprawdę n-tym wystąpieniem, liczy się od 1. Więc możesz wyprowadzić właściwe indeks przez odjęcie 1. I jak widać daje 0 - lastIndex 0 - dla nie znaleziono).
A jeśli chcesz dopasować rozciąganie, możesz go użyć podczas przechwytywania, ale nie wtedy, gdy wyrażenie regularne jest globalne, a kiedy to robisz, to zawartość tablicy nie jest wszystkimi dopasowaniami, ale są pełne mecz, po którym następuje przechwytywanie.
źródło
r.lastIndex
jest kluczowym czynnikiem do zrozumienia różnicy międzyexec
imatch
.If your regex is global, and you are capturing, then you must use exec. Match won't return all your captures.
Mam to na konsoli. Po prostu skopiuj / wklej"a,b,c,aa,bb,cc".match(/(\w+)/g);
Opera, Firefox."a,b,c,aa,bb,cc".match(/(\w+)/g)
To, co się tam dzieje, pokazuje wszystkie mecze i tak się składa, że przechwyciłeś każdy mecz, więc gdyby miał pokazać wszystkie ujęcia, wyglądałoby to dokładnie tak samo (.Match () funkcja
str.match(regexp)
będzie wykonać następujące czynności:g
flaga jest użyta w wyrażeniu regularnym: zwróci wszystkie podciągi (ignorując grupy przechwytywania)g
flaga nie jest używana w wyrażeniu regularnym: zwróci to samo coregexp.exec(str)
null
Przykłady funkcji .match () używającej
g
flagi:A .match () bez
g
flagi jest równoważne .exec () :.Exec () funkcja
regexp.exec(str)
będzie wykonać następujące czynności:g
flaga jest użyta w wyrażeniu regularnym: zwróci (za każdym razem, gdy jest wywoływana) :[N_MatchedStr, N_Captured1, N_Captured2, ...]
następnegoN
dopasowania. Ważne: nie przejdzie do następnego dopasowania, jeśli obiekt wyrażenia regularnego nie jest przechowywany w zmiennej (musi to być ten sam obiekt)g
flaga nie jest używana w wyrażeniu regularnym: zwróci to samo, co gdyby miałag
flagę i została wywołana po raz pierwszy i tylko raz.null
Przykład .exec () (zapisane wyrażenie regularne + użycie
g
flagi = zmienia się przy każdym wywołaniu):Przykłady .exec (), gdy nie zmienia się przy każdym wywołaniu:
źródło
Czasami regex.exec () zajmie znacznie więcej czasu niż string.match ().
Warto wspomnieć, że jeśli wynik string.match () i regex.exec () jest taki sam (np. Gdy nie używa się flagi \ g), regex.exec () zajmie miejsce od x2 do x30, a następnie string. mecz():
Dlatego w takich przypadkach użycie metody „new RegExp (). Exec ()” powinno być stosowane tylko wtedy, gdy potrzebujesz globalnego wyrażenia regularnego (tj. Aby wykonać więcej niż jeden raz).
źródło