Освоение сложных регулярных выражений
Регулярные выражения (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));
}
Заключение
Расширенные методы регулярных выражений, такие как утверждения просмотра назад, условные шаблоны, подпрограммы, рекурсия и притяжательные кванторы, расширяют возможности регулярных выражений для сложной обработки текста. Освоение этих концепций позволит вам решать сложные задачи сопоставления и манипулирования с большей эффективностью и точностью.