Czy istnieje sposób na pobranie (początkowych) pozycji znaków w ciągu wyników dopasowania wyrażenia regularnego () w JavaScript?
154
Czy istnieje sposób na pobranie (początkowych) pozycji znaków w ciągu wyników dopasowania wyrażenia regularnego () w JavaScript?
exec
zwraca obiekt z index
właściwością:
var match = /bar/.exec("foobar");
if (match) {
console.log("match found at " + match.index);
}
Oraz dla wielu dopasowań:
var re = /bar/g,
str = "foobarfoobar";
while ((match = re.exec(str)) != null) {
console.log("match found at " + match.index);
}
re
zmiennej jako zmiennej i dodanieg
modyfikatora są kluczowe! W przeciwnym razie otrzymasz niekończącą się pętlę.undefined
. jsfiddle.net/6uwn1vof/2, który nie jest przykładem podobnym do wyszukiwania, jak twój.g
flagę i zadziała. Ponieważmatch
jest funkcją ciągu, a nie wyrażenia regularnego, nie może być stanowąexec
, więc traktuje ją tylko jakoexec
(tj. Ma właściwość index), jeśli nie szukasz globalnego dopasowania ... ponieważ wtedy stan nie ma znaczenia .Oto, co wymyśliłem:
źródło
match.index + match[0].length
działa również dla pozycji końcowej.match.index + match[0].length - 1
?.slice()
i.substring()
. Koniec obejmujący byłby o 1 mniej, jak mówisz. (Uważaj, że dołączenie zwykle oznacza indeks ostatniego znaku wewnątrz dopasowania, chyba że jest to pusty mecz, w którym jest 1 przed dopasowaniem i może znajdować-1
się całkowicie poza ciągiem dla pustego dopasowania na początku ...)Z dokumentacji developer.mozilla.org na temat
.match()
metody String :Kiedy mamy do czynienia z nieglobalnym wyrażeniem regularnym (tj. Brakiem
g
flagi w Twoim wyrażeniu regularnym), wartość zwracana przez.match()
maindex
właściwość… wszystko, co musisz zrobić, to uzyskać do niego dostęp.Oto przykład pokazujący, że również działa:
Z powodzeniem przetestowałem to aż do IE5.
źródło
Możesz użyć
search
metodyString
obiektu. To zadziała tylko dla pierwszego dopasowania, ale poza tym zrobi to, co opisujesz. Na przykład:źródło
Oto fajna funkcja, którą niedawno odkryłem, wypróbowałem to na konsoli i wydaje się, że działa:
Który zwrócił: „border 6 bottom 13 left 18 radius”
Więc wydaje się, że to jest to, czego szukasz.
źródło
arguments
. Nie „drugi argument”. Argumentami funkcji są "pełne dopasowanie, grupa1, grupa2, ...., indeks dopasowania, pełny ciąg dopasowany do"W nowoczesnych przeglądarkach można to osiągnąć za pomocą string.matchAll () .
Zaletą tego podejścia
RegExp.exec()
jest to, że nie polega ono na tym, że wyrażenie regularne jest stanowe, jak w odpowiedzi @ Gumbo .źródło
Ten element członkowski fn zwraca tablicę pozycji opartych na 0, jeśli takie istnieją, słowa wejściowego wewnątrz obiektu String
Spróbuj teraz
Możesz także wprowadzić wyrażenia regularne:
Tutaj otrzymujemy indeks pozycji członu liniowego.
źródło
źródło
str.indexOf
tutaj po prostu znajduje następne wystąpienie tekstu przechwyconego przez dopasowanie, które niekoniecznie jest zgodne. JS regex obsługuje warunki w tekście poza przechwytywaniem z wyprzedzeniem. Na przykładsearchIndex("foobarfoobaz", "foo(?=baz)", true)
powinien dawać[6]
, a nie[0]
.lub
źródło