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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow