Якоря — ^ и $
Код: Выделить всё
^Привет
Код: Выделить всё
пока$
Код: Выделить всё
^Привет пока$
Код: Выделить всё
воробушки
Квантификаторы — * + ? и {}
Код: Выделить всё
abc*
Код: Выделить всё
abc+
Код: Выделить всё
abc?
Код: Выделить всё
abc{2}
Код: Выделить всё
abc{2,}
Код: Выделить всё
abc{2,5}
Код: Выделить всё
a(bc)*
Код: Выделить всё
a(bc){2,5}
Оператор ИЛИ — | или []
Код: Выделить всё
a(b|c)
Код: Выделить всё
a[bc]
Символьные классы — \d \w \s и .
Код: Выделить всё
\d
Код: Выделить всё
\w
Код: Выделить всё
\s
Код: Выделить всё
.
Используйте оператор . с осторожностью, так как зачастую класс или отрицаемый класс символов (который мы рассмотрим далее) быстрее и точнее.
У операторов \d, \w и \s также есть отрицания ― \D, \W и \S соответственно.
Например, оператор \D будет искать соответствия противоположенные \d.
\D соответствует одному символу, который не является цифрой -> тест
Некоторые символы, например ^.[$()|*+?{\ , необходимо выделять обратным слешем \ .
\$\d соответствует строке, в которой после символа $ следует одна цифра -> тест
Непечатаемые символы также можно искать, например табуляцию \t, новую строку \n, возврат каретки \r.
Мы научились строить регулярные выражения, но забыли о фундаментальной концепции ― флагах.
Регулярное выражение, как правило, записывается в такой форме /abc/, где шаблон для сопоставления выделен двумя слешами /. В конце выражения, мы определяем значение флага (эти значения можно комбинировать):
Код: Выделить всё
g
Код: Выделить всё
m
Код: Выделить всё
i
Средний уровень
Скобочные группы ― ()
Код: Выделить всё
a(bc)
Код: Выделить всё
a(?:bc)*
Код: Выделить всё
a(?<foo>bc)
Этот оператор очень полезен, когда нужно извлечь информацию из строк или данных, используя ваш любимый язык программирования. Любые множественные совпадения, по нескольким группам, будут представлены в виде классического массива: доступ к их значениям можно получить с помощью индекса из результатов сопоставления.
Если присвоить группам имена (используя (?<foo>...)), то можно получить их значения, используя результат сопоставления, как словарь, где ключами будут имена каждой группы.
Скобочные выражения ― []
Код: Выделить всё
[abc]
Код: Выделить всё
[a-c]
Код: Выделить всё
[a-fA-F0–9]
Код: Выделить всё
[0–9]%
Код: Выделить всё
[^a-zA-Z]
Помните, что внутри скобочных выражений все специальные символы (включая обратную косую черту \) теряют своё служебное значение, поэтому нам ненужно их экранировать.
Жадные и ленивые сопоставления
Квантификаторы ( * + {}) ― это «жадные» операторы, потому что они продолжают поиск соответствий, как можно глубже ― через весь текст.
Например, выражение <.+> соответствует <div>simple div</div> в This is a <div> simple div</div> test. Чтобы найти только тэг div ― можно использовать оператор ?, сделав выражение «ленивым»:
<.+?> соответствует любому символу, один или несколько раз найденному между < и >, расширяется по мере необходимости -> тест
Обратите внимание, что хорошей практикой считается не использовать оператор . , в пользу более строгого выражения:
<[^<>]+> соответствует любому символу, кроме < или >, один или более раз встречающемуся между < и > -> тест
Продвинутый уровень
Границы слов ― \b и \B
Код: Выделить всё
\babc\b
Код: Выделить всё
\b
Код: Выделить всё
\B
Код: Выделить всё
\Babc\B
Обратные ссылки — \1
Код: Выделить всё
([abc])\1 \1
Код: Выделить всё
([abc])([de])\2\1
Код: Выделить всё
(?<foo>[abc])\k<foo>
Опережающие и ретроспективные проверки — (?=) and (?<=)
Код: Выделить всё
d(?=r)
Код: Выделить всё
(?<=r)d
Вы можете использовать оператор отрицания !
Код: Выделить всё
d(?!r)
Код: Выделить всё
(?<!r)d
Заключение
Как вы могли убедиться, области применения регулярных выражений разнообразны. Я уверен, что вы сталкивались с похожими задачами в своей работе (хотя бы с одной из них), например такими:
Валидация данных (например, правильно ли заполнена строка time)
Сбор данных (особенно веб-скрапинг, поиск страниц, содержащих определённый набор слов в определённом порядке)
Обработка данных (преобразование сырых данных в нужный формат)
Парсинг (например, достать все GET параметры из URL или текст внутри скобок)
Замена строк (даже во время написания кода в IDE, можно, например преобразовать Java или C# класс в соответствующий JSON объект, заменить “;” на “,”, изменить размер букв, избегать объявление типа и т.д.)
Подсветка синтаксиса, переименование файла, анализ пакетов и многие другие задачи, где нужно работать со строками (где данные не должны быть текстовыми).