Что такое регулярное выражение? Полное объяснение
Быстрый ответ
Regular expression — паттерн, описывающий множество строк. Использует literal characters и metacharacters (*, +, ?, ., ^, $, [], (), {}, |, \) со специальными значениями. Regex для валидации, поиска, извлечения и замены. Используйте наш бесплатный Regex Tester.
Введение
Regular expression (regex или regexp) — последовательность символов, определяющая search-паттерн. Паттерн используется алгоритмами string-searching для поиска, match или replace текста. Regex возник в теории формальных языков в 1950-х (Stephen Kleene) и был принят в Unix-инструменты (grep, sed, awk) в 1970-х. Сегодня regex встроен практически в каждый язык программирования и редактор.
Шаг за шагом
-
Понимать литералы и метасимволы
Буквальные символы (a, b, 1, @) соответствуют сами себе. Метасимволы имеют особое значение: . соответствует любому символу, * означает ноль или более, + означает один или несколько, ? означает ноль или единицу, ^ соответствует началу, $ соответствует концу.
-
Изучите классы персонажей
Квадратные скобки [] определяют класс символов: [aeiou] соответствует любой гласной, [0-9] соответствует любой цифре, [^0-9] соответствует любой нецифре. Классы сокращений: \d (цифра), \w (словный символ), \s (пробел) и их отрицания в верхнем регистре.
-
Используйте квантификаторы
Кванторы определяют, сколько раз повторяется шаблон: * (0+), + (1+), ? (0 или 1), {n} (ровно n), {n,} (n+), {n,m} (от n до m). Жадный по умолчанию; добавлять ? для ленивого сопоставления (например, *?).
-
Группа и якорь
Круглые скобки () создают группы захвата. Чередование | соответствует любой стороне (кошка|собака). Якоря ^ и $ соответствуют началу и концу строки. Используйте их, чтобы создавать сложные узоры из более простых.
Примеры
Сопоставьте шаблон, подобный электронному письму
Вход: Pattern: [a-z]+@[a-z]+\.[a-z]+
Выход: Соответствует: alice@example.com, bob@test.org.
Сопоставить формат номера телефона
Вход: Pattern: \d{3}-\d{3}-\d{4}
Выход: Matches: 555-123-4567
Извлечение пар ключ-значение
Вход: Pattern: (\w+)=(\w+)
Выход: Matches 'key=value' with group 1 as key, group 2 as value
Распространенные проблемы
- Жадное сопоставление требует чрезмерного потребления —.* соответствует максимально возможному количеству совпадений. Использовать .*? для ленивого сопоставления, чтобы найти самое короткое совпадение.
- Если забыть экранировать специальные символы —., *, +, ? и т. д., они являются специальными. Используйте \ для их буквального соответствия (например, \. соответствует буквальной точке).
- Катастрофический возврат — шаблоны с вложенными кванторами (например, (a+)+) могут занимать экспоненциальное время для определенных входных данных, вызывая атаки ReDoS.
- Чрезмерное совпадение — без привязок (^ и $) шаблон совпадает где угодно. Используйте ^...$, чтобы сопоставить всю строку.
Советы
- Начните с простого и постепенно усложняйте — отладка сложного регулярного выражения одновременно очень сложна.
- Используйте тестер регулярных выражений, чтобы экспериментировать с шаблонами в образце текста — просматривайте совпадения, выделенные в режиме реального времени.
- Комментируйте сложные регулярные выражения, используя расширенный режим (флаг /x в некоторых движках) или разбивайте их на именованные части.
- Используйте наш тестер регулярных выражений для мгновенного тестирования шаблонов в вашем браузере — без регистрации, полностью конфиденциально.