Gdy powtarzasz grupę przechwytywania, w większości smaków zachowywane jest tylko ostatnie przechwycenie; wszelkie poprzednie przechwycenia są nadpisywane. W niektórych smakach, np. .NET, można uzyskać wszystkie pośrednie przechwytywania, ale nie jest to w przypadku Javascript.
Oznacza to, że w Javascript, jeśli masz wzorzec z N grup przechwytywania, możesz przechwycić tylko dokładnie N ciągów na dopasowanie, nawet jeśli niektóre z tych grup zostały powtórzone.
Więc ogólnie rzecz biorąc, w zależności od tego, co musisz zrobić:
- Jeśli jest to opcja, zamiast tego podziel na ograniczniki
- Zamiast dopasowywania
/(pattern)+/
, może dopasowywania /pattern/g
, być może w exec
pętli
- Zwróć uwagę, że te dwa nie są dokładnie równoważne, ale może to być opcja
- Wykonaj dopasowanie wielopoziomowe:
- Przechwyć powtarzającą się grupę w jednym meczu
- Następnie uruchom kolejne wyrażenie regularne, aby rozdzielić to dopasowanie
Bibliografia
Przykład
Oto przykład dopasowania <some;words;here>
w tekście, użycia exec
pętli, a następnie podziału w ;
celu uzyskania pojedynczych słów ( zobacz także na ideone.com ):
var text = "a;b;<c;d;e;f>;g;h;i;<no no no>;j;k;<xx;yy;zz>";
var r = /<(\w+(;\w+)*)>/g;
var match;
while ((match = r.exec(text)) != null) {
print(match[1].split(";"));
}
Zastosowany wzór to:
_2__
/ \
<(\w+(;\w+)*)>
\__________/
1
Dopasowuje <word>
, <word;another>
, <word;another;please>
, itd. Grupa 2 powtarza się uchwycić każdą liczbę słów, ale może tylko zachować ostatnią przechwytywanie. Cała lista słów jest przechwytywana przez grupę 1; ten ciąg jest następnie split
na separatorze średnika.
Powiązane pytania
"foo bar baz".match(/\w+/g) //=> ["foo", "bar", "baz"]
. ignoruje dopasowany ciąg z przodu, ale nadal jest rozsądną alternatywą.Jeśli nie masz bardziej skomplikowanych wymagań dotyczących sposobu dzielenia ciągów, możesz je podzielić, a następnie zwrócić z nimi początkowy ciąg:
var data = "foo bar baz"; var pieces = data.split(' '); pieces.unshift(data);
źródło
spróbuj użyć „g”:
"foo bar baz".match(/\w+/g)
źródło