Регулярные выражения
История
- Кен Томпсон добавил поиск по регулярному выражению в редактор QED в конце 1960-х, позаимствовав нотацию из теоретической статьи Клини (1956 г.)
- В 1968 г. из QED регулярные выражения перекочевали в ed – стандартный текстовый редактор системы
- В 1970 г. из ed — в grep с попутным расширением (т.н. extended regular expressions)
- В 1986 г. появился POSIX стандарт для базовых (BRE) и расширенных (ERE) регулярных выражений
- В 1987 г. Генри Спенсер публикует интерпретатор Perl со встроенной поддержкой регулярных выражений
- В 1997 г. Филип Хейзел разрабатывает perl-совместимые регулярные выражения (PCRE) — чаще всего в современности в языках программирования встречаются именно они или их разновидность
Определение
Регулярные выражения — способ описывать регулярные языки.
На практике регулярные выражения используют как шаблон, задающий правило поиска.
Нотация
Составляется такой шаблон из двух типов символов:
-
Литералы — обычные символы:
- Все символы за исключением специальных
[ ] \ ^ $ . | ? * + ( ) { }
- Специальные символы предваренные
\
, например:\[
или\$
- Все символы за исключением специальных
-
Метасимволы (wildcards) — специальные символы, которые используются для замены других символов (множества символов) и их последовательностей.
Метасимвол .
Метасимвол .
обозначает один любой символ.
Пример:
st..d
– регулярное выражение под которое подходят:
- stand
ard
- stand
- astddd
Символьные Классы
Символьный класс позволяет указать, что на данном месте в строке может стоять один из перечисленных символов.
[A-Z]
– любая заглавная латинская буква;[a-d]
– строчная буква от a до d;[A-Za-z0-9]
– латинская буква или цифра;[А-Яа-яЁё]
– любая русская буква;[^abc]
— отрицание, т.е. все символы кроме букв латинского алфавита a, b, c.
Как перечислить символ -
внутри []
? А что насчёт ^
?
Перечисление (объединение) |
Вертикальная черта |
позволяет перечислить несколько вариантов.
Пример:
(gray|grey)
– регулярное выражение под которое подходят:
gray
grey
Позиция внутри строки
Ниже приведена таблица, демонстрирующая основные спецсимволы (но не все!) и пример их использования:
Символ | Описание | Пример | Соответствие |
---|---|---|---|
^ | начало строки | ^a | aaa aaa |
$ | конец строки | a$ | aaa aaa |
\b | граница слова | a\b, \ba | aaa aaa, aaa aaa |
\B | не граница слова | \Ba\B | aaa aaa |
- Символ
^
соответствует началу строки. - Символ
$
соответствует концу строки. \b
обозначает границу слова.\B
обозначает не границу слова.
Кванторы
Основные кванторы
Кванторы в регулярных выражениях позволяют указать количество повторений символов или групп символов. Ниже приведены основные кванторы:
Квантор | Описание | Пример | Соответствие |
---|---|---|---|
* | ноль или более | colou*r | color , colour , colouur и т.д. |
+ | одно или более | colou+r | colour , colouur и т.д. |
? | ноль или один | colou?r | color , colour |
Расширенные кванторы
Расширенные кванторы позволяют более точно указать количество повторений:
Квантор | Описание | Пример | Соответствие |
---|---|---|---|
{n} | ровно n раз | colou{3}r | colouuur |
{m,n} | от m до n раз | colou{2,4}r | colouur , colouuur , colouuuur |
{m,} | m или более | colou{2,}r | colouur , colouuur , colouuuur и т.д. |
{,n} | n или менее | colou{,3}r | color , colour , colouur , colouuur |
Пример использования кванторов
Пример регулярного выражения для MAC-адресов:
^([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}$
Это выражение соответствует строкам, целиком являющимся MAC-адресами.
Типы квантификации
Движки регулярных выражений можно заставить по-разному искать соответствие квантификаторам:
- Ленивая квантификация - ищем как можно меньшее число повторов.
- Жадная квантификация - ищем как можно большее число повторов.
- Ревнивая квантификация (сверхжадная) - ищем максимально возможное число повторов; однажды схватив, движок не отпускает захваченное.
Нотация квантификации
Жадные квнторы мы уже использовали ранее, их ленивое и ревнивое соответствие можно получить, добавив в конце ?
или +
.
Например,
*
- жадный квантор.*?
- ленивый квантор.*+
- ревнивый квантор.
Пример ленивой квантификации
Пример:
”.*” – регулярное выражение под которое подходят:
“witch” and her “broom” is one
”.*?” – регулярное выражение под которое подходят два вхождения строки:
“witch” and her “broom” is one
Группы
Круглые скобки используются для определения области действия и приоритета операций.
Пример:
(тр[ау]м-?)* – регулярное выражение, под которое подходят:
трам-трам-трум трам-трум-трамтрум
Обратные ссылки
При обработке выражения подстро́ки, найденные по шаблону внутри группы, сохраняются в отдельной области памяти и получают номер начиная с единицы. На них можно ссылаться в выражении.
Пример:
(та|ту)-\1
регулярное выражение, под которое подходят:
та-та или ту-ту,
но не та-ту
Важно! Квантификация группы не влияет на сохранённый ре- зультат – сохраняется только первое вхождение.
look-*
Есть только в PCRE (см. ниже):
Паттерн | Имя | Описание |
---|---|---|
(?=foo) | lookahead | Проверяет, что за текущей позицией дальше в строке встретится foo |
(?<=foo) | lookbehind | Проверяет, что перед текущей позицией в строке стоит foo |
(?!foo) | negative lookahead | Проверяет, что за текущей позицией дальше в строке не стоит foo |
(?<!foo) | negative lookbehind | Проверяет, что перед текущей позицией в строке не стоит foo |
Всё, что попадает под look-*
, при работе движка, не считается частью совпадения и откидывается.
Regexp flavors
Как уже упоминалось, исторически POSIX содержит два стан- дарта для регулярных выражений и отдельно есть PCRE:
особенности | |
---|---|
Basic Regular Expressions | \? \+ \{ \} \| \( \) – являются спецсимволами ? + { } | ( ) – обычные символы |
Extended Regular Expressions | ? + { } | ( ) – спецсимволы, если нужно найти такие в тексте, то в регулярном выражении они должны быть экранированы с помощью \ |
Perl Compatible Regular Expressions | Сильно шире ERE и BRE. Случайно могут открыть портал в ад: см. \K, lookahead, lookbehind, conditional subpatterns и пр. |
Примеры
1: Поиск даты
Регулярное выражение для поиска даты в формате ДД.ММ.ГГГГ
:
\b\d{2}\.\d{2}\.\d{4}\b
2: Поиск email
Регулярное выражение для поиска email:
\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b
3: Поиск URL
Регулярное выражение для поиска URL:
\bhttps?://[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))\b
Полезные ссылки
- Большая документация про все регулярки https://www.regular-expressions.info/
- Небольшая документация http://www.rexegg.com/regex-quickstart.html
- Интерактивная тыкалка, каких много:
- http://buildregex.com/