Регулярные выражения — особенности

Как работает регулярное выражение (regexp): сначала оно пытается найти максимально возможное совпадение для текущей группы символов, затем посимвольно откатываясь к началу совпавшей подстроки (backtracking), в попытке найти совпадение для последующей группы символов регулярного выражения. Это верно для «жадных» (greedy) типов групп (по умолчанию, к примеру [\w]*). Если группа «ленивая» (lazy), то откатывание производится от начала совпавшей подстроки вперёд. Пример ленивой группы — [\w]*?.

Ниже перечислены некоторые вещи о регулярных выражениях, которые полезно знать.

  1. Capturing Groups

    повтор группы:

  2. Named Capturing Groups

    повтор группы:

  3. Non-Capturing Groups.

  4. Atomic Grouping (атомарные группы).
    Атомарная группа не откатывается, поэтому работает значительно быстрее, но совсем не такая гибкая.

    Пример:
    a(?:bc|b)c совпадёт и с abc, и с abcc,
    а a(?>bc|b)c совпадёт с abcc, но не с abc. С последней строкой совпадения не будет, т.к. произойдёт совпадение (?>bc|b) с последними двумя буквами строки, после чего будет сделана попытка сравнить символ c с пустой строкой, которая потерпит неудачу. Неатомарная группа сделала бы откатывание с попыткой поиска совпадения альтернативы (b), но атомарная группа не может откатиться после того, как было найдено любое совпадение с ней.

  5. Lookahead:
    positive lookahead — утверждение, что после группы должна находиться определённая группа.

    negative lookahead — утверждение, что после группы не должно быть определённой группы.

    При этом длина lookahead и lookbehind равна нулю, т.е. дальнейший поиск совпадений начинается с группы, предшествующей lookahead-у. Lookahead и lookbehind являются атомарными группами (см. выше).
    Пример:
    b(?=a) совпадёт с b в back, но не совпадёт с b в bed или в debt.
  6. Lookbehind:
    positive lookbehind — утверждение, что перед группой должна находиться определённая группа.

    negative lookbehind — утверждение, что перед группой не должно быть определённой группы.

LEAVE A COMMENT