Regular Expressions
Grupowanie atomowe
Szukaj…
Wprowadzenie
Regularne grupy nie przechwytujące pozwalają silnikowi ponownie wejść do grupy i spróbować dopasować coś innego (na przykład inną alternatywę lub dopasować mniej znaków, gdy używany jest kwantyfikator).
Grupy atomowe różnią się od zwykłych grup nie przechwytujących tym, że cofanie jest zabronione. Po wyjściu grupy wszystkie informacje dotyczące cofania są odrzucane, więc nie można próbować alternatywnych dopasowań.
Uwagi
Kwantyfikator dzierżawczy zachowuje się jak grupa atomowa, ponieważ silnik nie będzie w stanie prześledzić tokenem lub grupą.
Poniższe są równoważne pod względem funkcjonalności, chociaż niektóre będą szybsze niż inne:
a*+abc
(?>a*)abc
(?:a+)*+abc
(?:a)*+abc
(?:a*)*+abc
(?:a*)++abc
Grupowanie za pomocą (?>)
Korzystanie z grupy atomowej
Grupy atomowe mają format (?>...)
z ?>
Po otwartym paren.
Rozważ następujący przykładowy tekst:
ABC
Wyrażenie regularne spróbuje dopasować zaczynając od pozycji 0 tekstu, która jest przed literą A
w ABC
.
Jeśli użyte zostanie wyrażenie bez rozróżniania wielkości liter (?>a*)abc
, (?>a*)
dopasuje znak 1 A
, pozostawiając
BC
jako pozostały tekst do dopasowania. Grupa (?>a*)
jest opuszczana, a abc
jest próbowany na pozostałym tekście, który nie pasuje.
Silnik nie jest w stanie wrócić do grupy atomowej, więc bieżące przejście nie powiedzie się. Silnik przesuwa się do następnej pozycji w tekście, która byłaby w pozycji 1, która jest za literą A
i przed literą B
ABC
.
Regex (?>a*)abc
próbuje ponownie, a (?>a*)
mecze A
0 razy, pozostawiając
BC
jako pozostały tekst do dopasowania. Grupa (?>a*)
jest opuszczana i próbuje się (?>a*)
abc
, co kończy się niepowodzeniem.
Znowu silnik nie jest w stanie wrócić do grupy atomowej, więc bieżące przejście kończy się niepowodzeniem. Wyrażenie regularne będzie nadal działać, dopóki wszystkie pozycje w tekście nie zostaną wyczerpane.
Korzystanie z grupy nieatomowej
Zwykłe grupy nie przechwytujące mają format (?:...)
z ?:
Po otwartym paren.
Biorąc pod uwagę ten sam przykładowy tekst, ale zamiast wyrażenia (?:a*)abc
bez rozróżniania wielkości liter, dopasowanie wystąpiłoby, ponieważ dozwolone jest cofanie.
Na początku (?:a*)
zużyje literę A
w tekście
ABC
odejście
BC
jako pozostały tekst do dopasowania. Grupa (?:a*)
jest opuszczana, a abc
jest próbowany na pozostałym tekście, który nie pasuje.
Silnik cofa się do grupy (?:a*)
i próbuje dopasować 1 mniej znaków: Zamiast dopasowywać znak 1 A
, próbuje dopasować znaki 0 A
i grupa (?:a*)
zostaje zamknięta. To opuszcza
ABC
jako pozostały tekst do dopasowania. Wyrażenie regularne abc
jest teraz w stanie z powodzeniem dopasować pozostały tekst.
Inny przykładowy tekst
Rozważ ten przykładowy tekst z grupami zarówno atomowymi, jak i nieatomowymi (ponownie bez rozróżniania wielkości liter):
AAAABC
Wyrażenie regularne spróbuje dopasować zaczynając od pozycji 0 tekstu, która jest przed pierwszym A
w AAAABC
.
Wzorzec używający grupy atomowej (?>a*)abc
nie będzie w stanie się dopasować, zachowując się prawie identycznie jak w powyższym przykładzie atomowej ABC
: wszystkie 4 znaki A
są najpierw dopasowywane za pomocą (?>a*)
(pozostawiając BC
jako pozostały tekst do dopasowania), a abc
nie może dopasować tego tekstu. Nie można ponownie dołączyć do grupy, więc dopasowanie się nie powiedzie.
Wzorzec wykorzystujący grupę nieatomową (?:a*)abc
będzie mógł się dopasować, zachowując się podobnie do powyższego przykładu nieatomowego ABC
: wszystkie 4 znaki A
są najpierw dopasowywane za pomocą (?:a*)
(pozostawiając BC
jako pozostały tekst do dopasowania), a abc
nie może dopasować tego tekstu. Grupa może być ponownie wprowadzony, tak jeden mniej próby: 3 A
A
znaki są dopasowane zamiast 4 (opuszczającego ABC
jak pozostała tekstu do dopasowania) i abc
jest w stanie skutecznie pasuje w tym tekście.