Регулярные выражения в программировании — это формальный язык, описывающий шаблон, по которому в тексте будет осуществлён поиск подстроки. Вместе с этой меткой обязательно указывайте метку реализации регулярных выражений (C#, Java, PHP и тому подобное).
Регулярные выражения — это формальный язык, описывающий шаблон, в соответствии с которым в тексте будет проводиться поиск подстроки. В дискретной математике принято другое определение термина.
В реализациях регулярных выражений для различных языков программирования присутствует обычно как минимум три операции для манипулирования найденной подстрокой:
- find — находит одно совпадение,
- match — возвращает логическое значение, соответствует ли текст шаблону,
- replace — заменяет найденную подстроку на другой текст.
Большинство современных языков программирования имеют встроенную поддержку регулярных выражений. Среди них Perl, Java, PHP, JavaScript, языки платформы .NET Framework, Python, Tcl, Ruby, Lua, C++ (стандарт 2011 года) и другие.
Как задать вопрос про регулярные выражения
- Укажите реализацию регулярных выражений (POSIX, PCRE, ECMAScript, Lua и др.)
- Не нужно пытаться объяснить на пальцах сложными фразами, что Вы хотите получить. Лучше приведите:
- пример текста, к которому будет применяться регулярное выражение,
- что Вы хотите получить,
- что Вы не хотите получить.
- Ссылки на онлайн-отладчики приветствуются, но внесите необходимые данные в сам вопрос.
- Даже если Вы плохо разбираетесь в регулярных выражениях, покажите, что Вы пытались и старались. Не следует просто просить написать регулярное выражение за Вас.
- Не путайте регулярные выражения с шаблонами поиска.
- Кроме того, для следующих видов задач есть решения получше, нежели регулярные выражения:
- Разбор разметки HTML, XML, xHTML, WML и проч., вычленения тегов, атрибутов, значений и всего такого следует выполнять специализированными парсерами. Следует учитывать, что парсеры бывают потоковыми (SAX) и строящие дерево (DOM). Первый вид работает эффективнее, но зато вторые могут похвастаться простым интерфейсом.
- Разбор URL, URI, IRI и иже с ними можно проводить специально заточенными под это библиотеками. Модуль urllib.parse в Python или net/url в Go, класс URI в Java или Uri в C#, функция parse_url в PHP, объект URL или хак с тегом <a> в JavaScript.
Синтаксис регулярных выражений
В разных реализациях регулярных выражений может быть различный функционал, поэтому уточняйте, какие конкретные возможности регулярных выражений поддерживаются в языке, который Вы используете. Ниже описывается синтаксис из ECMAScript, совместимый с PCRE.
Метасимволы
Это символ или последовательность символов, которые означают не литерал, а имеют специальное назначение: группа литералов, позиция в тексте или являются конструктивным элементом регулярного выражения (это[](){}?|*+).
Позиционные метасимволы
Это метасимволы, которые означают не литерал, а некоторую позицию в тексте по определённым признакам.
Для понимания, что такое позиция: в тексте
мамаесть 5 позиций, и расположены они так:.м.а.м.а.они как бы находятся между литералами. Это очень важно понимать для правильного использования возможностей регулярных выражений, связанных с проверкой позиции.
^— этот метасимвол означает позицию начала текста. Если регулярное выражение используется с флагом MULTILINE, то этот метасимвол указывает на позицию начала строки многострочного текста.$— этот метасимвол означает позицию конца текста. Если регулярное выражение используется с флагом MULTILINE, то этот метасимвол указывает на позицию конца строки многострочного текста.\b— граница слова. Словом считаются буквенные литералы, цифры и нижнее подчёркивание, идущие подряд. Границы слова, соответственно, находятся слева и справа от слова. В тексте.мама. .мыла. .раму.границы слов обозначены точками.\B— НЕ граница словам.а.м.а м.ы.л.а р.а.м.у,\G— позиция конца предыдущего совпадения. Если текущее совпадение — первое, то это позиция начала текста.
Метасимволы группы литералов
Такие метасимволы являются синонимом для символьного класса, например, метасимвол \d равносилен символьному классу [0-9]. При этом метасимволы можно указывать внутри символьных классов. [\dabc] равносильно [0-9abc]. Один метасимвол, обозначающий группу литералов, совпадает в тексте ровно с одним литералом, если к нему не применена квантификация.
.— любой символ, кроме символа переноса строки\n. Если регулярное выражение используется с флагомDOT_ALL, то это любой символ. Внутри символьного класса обозначает литерал «точка».\d— цифра. Аналогично[0-9],\D— НЕ цифра. Аналогично[^0-9],\w— буква, цифра или знак нижнего подчёркивания[A-Za-z0-9_],\W— НЕ буква, цифра или знак нижнего подчёркивания,\s— пробельный символ. Любой пробельный символ Unicode или[\f\n\r\t\v ], если текст не в кодировке Unicode.\S— НЕ пробельный символ,\h— горизонтальный пробельный символ, без новой строки\r— возврат каретки,\n— перевод строки,\t— горизонтальная табуляция,\v— вертикальная табуляция,\f— конец страницы,\b— литерал «забой» внутри символьного класса. Вне символьного класса это метасимвол границы слова.\0— литерал «NULL» (пустой символ).\xhh—\uhhhh—\chh—
Экранирование
Чтобы использовать метасимвол, как литерал, его нужно экранировать обратным слэшем.
Регулярное выражение
\(\.\)задаёт последовательность литералов(.).
Квантификаторы (кванторы)
Квантификация — это повторение литерала, сгруппированных последовательностей или символьных классов определённое количество раз. Квантификация бывает «минимальной», «жадной», «сверхжадной».
Полезные ссылки
Изучение регулярных выражений
- Бен Форта. Регулярные выражения. 10 минут на урок (ISBN: 5-84590-713-6),
- Джеффри Фридл. Регулярные выражения (ISBN: 5-93286-121-5),
- Ян Гойвертс. Регулярные выражения. Сборник рецептов (ISBN 978-5-93286-181-3).
Онлайн-отладка
(Тестирование и публикация регулярных выражений онлайн)
- regex101.com PCRE (PHP), JavaScript, Python;
- debuggex.com PCRE, JavaScript, Python (создает графическую иллюстрацию);
- regexr.com JavaScript (есть готовая рыба), PCRE;
- regexplanet.com Go, Haskell, Java, JavaScript, .NET, Perl, PHP, Python, Rubi, Tcl, XRegExp;
- uiregex.com PCRE (PHP, JavaScript) — онлайн-генератор;
- functions-online.com PHP — генератор функций.