2011-06-27 10 views
6
  1. Zastanawiałem się, jak rozumieć grupę atomową, reprezentowaną jako (?>expr)? Do czego służy ?Grupa atomowa i niezapewniająca

    W http://www.regular-expressions.info/atomic.html, jedynym przykładem jest, gdy expr jest zmiany, takie jak regex a(?>bc|b)c meczów abcc ale nie abc. Czy istnieją przykłady, w których nie występuje naprzemienność w przypadku ?

  2. Czy grupa atomowa i niewyczerpująca to (?:expr), to samo?

Uwaga: nie ograniczam się do jednego konkretnego smaku Regex.

Odpowiedz

5

Grupy atomowe (i possessive modifier) są użyteczne, aby ominąć catastrophic backtracking - które mogą być wykorzystywane przez złośliwych użytkowników do wywoływania ataków typu DoS, poprzez pożeranie pamięci serwera.

Grupy niezapisujące są właśnie tym - nie przechwytujące. Silnik regex może cofać się do grupy niezapisującej; nie w grupę atomową.

+0

Dzięki! Jakie są różnice między grupami atomowymi a modyfikatorem dzierżawczym? Czy są to identyczne cele? – Tim

+0

Modyfikator dzierżawy to po prostu cukier syntaktyczny dla atomu: '(?: A | b) * +' jest równoważne '(?> (?: a | b) *)'. –

6

1) Gdy używane są grupy atomowe, silnik regex nie będzie przechodził wstecz w poszukiwaniu dalszych permutacji, jeśli pełne wyrażenie regularne nie zostało dopasowane dla danego ciągu znaków. Za każdym razem, gdy używasz alternacji, jeśli dopasowanie się powiedzie, regex natychmiast spróbuje dopasować resztę wyrażenia, ale będzie śledzić położenie, w którym możliwe są inne alternatywy. Jeśli reszta wyrażenia nie zostanie dopasowana, regex wróci do poprzednio zapisanej pozycji i wypróbuje inne kombinacje. Gdyby użyto Atomowego grupowania z, silnik regex miałby , a nie utrzymywał pozycję poprzednią i po prostu rezygnowałby z dopasowania. Powyższy przykład tak naprawdę nie wyjaśnia przeznaczenia grup atomowych. Po prostu wyraźnie pokazuje eliminację cofania. Grupy atomowe byłyby użyteczne w pewnych scenariuszach, w których stosuje się chciwości kwantyfikatory, a dalsze kombinacje są możliwe, nawet jeśli nie ma naprzemienności.

2) Grupy atomowe i grupy inne niż przechwytujące są różne. Grupy niezapisujące po prostu nie zapisują wartości dopasowań. Grupy atomowe po prostu wyłączają wycofywanie w przypadku, gdy potrzebne są dalsze kombinacje.

Na przykład, wyrażenie regularne a(?:bc|b)c pasuje zarówno abcc i abc (bez robienia meczu), podczas gdy a(?>bc|c)c pasuje tylko abcc. Jeśli wyrażenie regularne to a(?>b|bc)c, będzie pasować tylko do , podczas gdy a(?:b|bc)c będzie nadal pasować do obu.

+2

Nie zapomnij, grupy atomowe również nie przechwytują! – robinCTS