Регулярные выражения — особенности
Как работает регулярное выражение (regexp): сначала оно пытается найти максимально возможное совпадение для текущей группы символов, затем посимвольно откатываясь к началу совпавшей подстроки (backtracking), в попытке найти совпадение для последующей группы символов регулярного выражения. Это верно для «жадных» (greedy) типов групп (по умолчанию, к примеру [\w]*). Если группа «ленивая» (lazy), то откатывание производится от начала совпавшей подстроки вперёд. Пример ленивой группы — [\w]*?.
Ниже перечислены некоторые вещи о регулярных выражениях, которые полезно знать.
-
Capturing Groups
(группа)
повтор группы:
\1
-
Named Capturing Groups
(?P<имя_группы>группа)
повтор группы:
(?P=имя_группы)
-
Non-Capturing Groups.
(?:группа)
-
Atomic Grouping (атомарные группы).
Атомарная группа не откатывается, поэтому работает значительно быстрее, но совсем не такая гибкая.(?>группа)
Пример:
a(?:bc|b)c совпадёт и с abc, и с abcc,
а a(?>bc|b)c совпадёт с abcc, но не с abc. С последней строкой совпадения не будет, т.к. произойдёт совпадение (?>bc|b) с последними двумя буквами строки, после чего будет сделана попытка сравнить символ c с пустой строкой, которая потерпит неудачу. Неатомарная группа сделала бы откатывание с попыткой поиска совпадения альтернативы (b), но атомарная группа не может откатиться после того, как было найдено любое совпадение с ней. -
Lookahead:
positive lookahead — утверждение, что после группы должна находиться определённая группа.(?=группа)
negative lookahead — утверждение, что после группы не должно быть определённой группы.
(?!группа)
При этом длина lookahead и lookbehind равна нулю, т.е. дальнейший поиск совпадений начинается с группы, предшествующей lookahead-у. Lookahead и lookbehind являются атомарными группами (см. выше).
Пример:
b(?=a) совпадёт с b в back, но не совпадёт с b в bed или в debt. -
Lookbehind:
positive lookbehind — утверждение, что перед группой должна находиться определённая группа.(?<=группа)
negative lookbehind — утверждение, что перед группой не должно быть определённой группы.
(?<!группа)
LEAVE A COMMENT
Для отправки комментария вам необходимо авторизоваться.