2012-07-24 6 views
8

Próbuję stać się lepszy w wyrażeniach regularnych. Ciężko mi zrozumieć, co oznacza (?> expression). Gdzie mogę znaleźć więcej informacji na temat subekspresów, które nie są zwrotne? Opis linku THIS mówi:Jak działa podwyrażenie bez powrotu "(?> Exp)"

Chciwe podwyrażenie, znane również jako podwyrażenie bez powrotu. Dopasowuje się tylko jeden raz, a następnie nie uczestniczy w ponownym śledzeniu .

ten drugi związek: http://msdn.microsoft.com/en-us/library/bs2twtah(v=vs.71).aspx posiada również definicję zakaz wycofywania podwyrażenie ale nadal jestem problemy ze zrozumieniem, co oznacza także, że nie można myśleć o przykład gdzie użyję (?>exp)

Odpowiedz

9

Jak zawsze, dobrym początkiem jest regular-expressions.info.

Użyj grupy atomowej, jeśli chcesz się upewnić, że to, co zostało dopasowane, pozostanie częścią meczu.

Na przykład, w celu dopasowania do liczby „słowa”, które mogą lub nie mogą być oddzielone od przestrzeni, a następnie z okrężnicy, użytkownik próbował regex:

(?:[A-Za-z0-9_.&,-]+\s*)+: 

Gdy istnieje dopasowanie, Wszystko było w porządku. Ale kiedy nie było, jego komputer przestał reagować na obciążenie procesora w 100% z powodu katastroficznego cofnięcia, ponieważ silnik regex bezskutecznie próbowałby znaleźć pasującą kombinację słów, które pozwoliłyby dopasować następujący dwukropek. Co było oczywiście niemożliwe.

Korzystając grupę atomową, to można było zapobiec:

(?>[A-Za-z0-9_.&,-]+\s*)+: 

Teraz cokolwiek zostało dopasowane pozostaje dopasowane - bez nawrotów i dlatego szybko razy niepowodzeniem.

8

regex Tutorial ma stronę o tym tutaj: http://www.regular-expressions.info/atomic.html

Zasadniczo co robi to odrzuty backtracking informacji, co oznacza, że ​​a(?>bc|b)c mecze abcc ale nie abc.

Powód, dla którego nie pasuje do drugiego ciągu, polega na tym, że znajduje on dopasowanie z bc i odrzuca informacje o cofnięciu się o zmianę naprzemienną bc|b. Zasadniczo zapomina o jego części. Dlatego nie ma c po bc, a dopasowanie nie powiedzie się.

Najbardziej użyteczną metodą użycia grup atomowych, jak się je nazywa, jest optymalizacja wolnych wyrażeń regularnych. Możesz znaleźć więcej informacji na wyżej wspomnianej stronie.

1

Przeczytanie na possessive quantifiers[a-z]*+ powoduje, że mechanizm cofania zapamięta tylko poprzedni krok, który pasował do wszystkich poprzednich kroków, które pasowały.

Jest to przydatne, gdy prawdopodobne jest wykonanie wielu akceptowalnych kroków, które pochłoną pamięć, jeśli każdy krok zostanie zapisany dla każdej możliwej regresji cofania.

Kwantyfikatory ilościowe są skrótem dla grup atomowych.