Оволодіння складними регулярними виразами
Регулярні вирази (regex) — це універсальні інструменти для зіставлення шаблонів і маніпулювання текстом. У цьому підручнику розглядаються розширені методи регулярних виразів, які допомагають ефективніше керувати складними сценаріями обробки тексту.
Захищені твердження
Твердження Lookbehind дозволяють вам знайти відповідність шаблону, лише якщо йому передує інший шаблон. Це корисно для забезпечення контексту без включення його в збіг.
- Позитивний огляд назад
(?<=...)
: Збігається з шаблоном, лише якщо йому передує вказаний вираз. - Негативний 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));
}
Висновок
Розширені методи регулярних виразів, такі як ретроспективні твердження, умовні шаблони, підпрограми, рекурсія та присвійні квантифікатори, розширюють можливості регулярних виразів для обробки складного тексту. Оволодіння цими концепціями дозволить вам виконувати складні завдання зіставлення та маніпулювання з більшою ефективністю та точністю.