Розблокування потужності вдосконалених регулярних виразів

Регулярні вирази (regex) надають надійні інструменти для зіставлення шаблонів і маніпулювання текстом. У цій статті розглядаються розширені концепції регулярних виразів, які дають змогу точно й ефективно вирішувати складні завдання обробки тексту.

Твердження про погляд вперед і позаду

Твердження Lookahead і Lookbehind дозволяють вам знайти відповідність шаблону, лише якщо перед ним або за ним стоїть інший шаблон. Вони корисні для забезпечення контексту без включення його в матч.

  • Попередній позитивний пошук (?=...): Забезпечує збіг шаблону, лише якщо за ним слідує вказаний вираз.
  • Негативний пошук уперед (?!...): Забезпечує збіг шаблону, лише якщо за ним не йде вказаний вираз.
  • Позитивний огляд назад (?<=...): Забезпечує збіг шаблону, лише якщо йому передує вказаний вираз.
  • Negative Lookbehind (?<!...): Забезпечує збіг шаблону, лише якщо йому не передує вказаний вираз.

приклад:

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

Цей регулярний вираз відповідає іменам, яким передують "Mr." або "Mrs.".

Умовні шаблони

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

приклад:

(\d{3}-)?(?(1)\d{3}-\d{4}|\d{7})

Цей регулярний вираз відповідає телефонним номерам із або без коду міста.

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

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

приклад:

(?<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));
}

Висновок

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