Освоение сложных регулярных выражений

Регулярные выражения (regex) — это универсальные инструменты для сопоставления шаблонов и манипулирования текстом. В этом руководстве рассматриваются расширенные методы регулярных выражений, которые помогут вам более эффективно управлять сложными сценариями обработки текста.

Утверждения ретроспективного просмотра

Утверждения Lookbehind позволяют сопоставлять шаблон только в том случае, если ему предшествует другой шаблон. Это полезно для обеспечения контекста без его включения в сопоставление.

  • Позитивный просмотр назад (?<=...): Соответствует шаблону, только если ему предшествует указанное выражение.
  • Отрицательный просмотр (?<!...): Соответствует шаблону, только если ему не предшествует указанное выражение.

Пример:

(?<=Mr\.|Mrs\.)\s[A-Z]\w+

Это регулярное выражение соответствует именам, которым предшествует "Mr." или "Mrs.".

Условные шаблоны

Условные шаблоны позволяют сопоставлять разные шаблоны в зависимости от того, соблюдается ли определенное условие. Синтаксис: (?(условие)истинный-шаблон|ложный-шаблон).

Пример:

(\d{3}-)?\d{3}-\d{4}

Это регулярное выражение соответствует телефонным номерам с кодом города или без него.

Подпрограммы и рекурсия

Подпрограммы и рекурсия позволяют повторно использовать шаблоны в одном и том же регулярном выражении или сопоставлять вложенные структуры. Это особенно полезно для сложных и вложенных данных.

Пример:

(?<group>\((?>[^()]+|(?&group))*\))

Это регулярное выражение сопоставляет сбалансированные круглые скобки с вложенными уровнями.

Притяжательные квантификаторы

Притяжательные квантификаторы предотвращают обратный поиск в механизме регулярных выражений, что может повысить производительность, если вы хотите гарантировать, что возврат не произойдет.

Пример:

\w++

Это регулярное выражение сопоставляет последовательность символов слова притяжательно, то есть оно не будет отказываться от совпавших символов.

Использование флагов для расширенного сопоставления

Флаги регулярных выражений изменяют поведение сопоставления с образцом. Некоторые распространенные флаги включают в себя:

  • 'i': Сопоставление без учета регистра.
  • 'm': Многострочный режим, влияющий на поведение ^ и $.
  • 's': Режим Dotall, позволяющий . соответствовать символам новой строки.
  • 'x': Игнорируйте пробелы и разрешайте комментарии внутри шаблона для удобства чтения.

Пример:

/pattern/imsx

Этот шаблон применяет режимы без учета регистра, многострочный, точечный и расширенный.

Примеры на языках программирования

Вот несколько примеров использования расширенных регулярных выражений в Python и JavaScript:

Пример Python

import re

# Match a name preceded by Mr. or Mrs.
pattern = r'(?<=Mr\.|Mrs\.)\s[A-Z]\w+'
text = 'Mr. Smith and Mrs. Johnson'
matches = re.findall(pattern, text)

for match in matches:
    print('Match found:', match)

Пример JavaScript

// Match a name preceded by Mr. or Mrs.
const pattern = /(?<=Mr\.|Mrs\.)\s[A-Z]\w+/g;
const text = 'Mr. Smith and Mrs. Johnson';
const matches = text.match(pattern);

if (matches) {
    matches.forEach(match => console.log('Match found:', match));
}

Заключение

Расширенные методы регулярных выражений, такие как утверждения просмотра назад, условные шаблоны, подпрограммы, рекурсия и притяжательные кванторы, расширяют возможности регулярных выражений для сложной обработки текста. Освоение этих концепций позволит вам решать сложные задачи сопоставления и манипулирования с большей эффективностью и точностью.