Регулярные выражения – это мощный инструмент для поиска и замены символов в тексте. Само регулярное выражение представляет из себя обычную строку составленную по определенным правилами. Эта строка имеет две косые черты / /
, где после первой – идёт специальный паттерн для поиска, а после второй – набор флагов, влияющих на результат.
Возможности регулярных выражений будут очень полезны при решении многих задач в программировании. Сейчас почти каждый язык содержит встроенные инструменты для работы с регуляркой. Например Python, JavaScript, Go, Kotlin, C# и так далее.
Для тренировки использования регулярных выражений используйте Regex101.com.
- 🔍 Базовое применение
- 🚩 Флаги
- 🗂️ Основной синтаксис
- ✍️ Практика
- 📚 Дополнительные материалы
Возьмем для примера случайный текст. Представим, что в этом тексте нам нужно найти все слова Park
. Это самый простой случай использования регулярных выражения, нам всего лишь необходимо вписать нужное слово между косыми чертами:
Флаги влияют на результат поиска. Их всего 5 штук:
i
– позволяет игнорировать регистры букв (нет разницы между A и a).g
– позволяет искать все совпадения в тексте, без него – только первое.m
– включение многострочного режима (влияет только на поведение^
и$
).s
– текст трактуется как одна строка, в этом случае метасимволу.
(точка) соответствует любой одиночный символ, включая символ новой строки.u
– unicode-трактовка. Выражение может содержать специальные паттерны, характерные для юникода.
На месте точки может быть любой символ. Количеством точек можно определять длину слов.
/t..k/g;
take look team
took
hike trackteak
time
Позволяют указать определенный перечень символов.
/t[aoi]k/g;
tek
tok
tdktak
tik
tuk tyk took taoik
Позволяет исключить определенный набор символ из поиска, используется вместе с квадратными скобками.
/ba[^td]/g;
ban
bag
batbas
bad
Указывает диапазон с первого по последний символ (включительно) в алфавитном порядке.
/[a-d]../g;
ost hst
ast
fstcst
bst
Аналогично работает с цифрами:
/201[5-9]/g;
2010 2012
2015
2017
2019
2022
Звездочка после символа указывает, что данный символ может отсутствовать, либо совпадать один или более раз.
/wo*w/g;
wow
waw wiwwoooow
waweww
woow
Плюс после символа указывает, что данный символ должен присутствовать один или более раз.
/go+gle/g;
gogle
gugle g00glegoooogle
Вопросительный знак после символа указывает, что данный символ является не обязательным (может либо отсутствовать, либо встречаться только один раз).
/bou?nd/g;
bond
bound
bouuund boynd
Чтобы указать точное количеcтво повторений, необходимо после символа записать фигурные скобки с нужным числом.
/bo{3}m/g;
boom bom
booom
bm boooom
Чтобы указать диапазон повторений, необходимо после символа записать фигурный скобки с нужным диапазоном, разделенным запятой.
/lo{2,4}k/g;
lok
look
lkloook
looook
loooooook
Верхнюю границу можно опускать. Например, запись a{3,}
говорит о том, что символ a должен встречаться не менее трёх раз.
Скобки позволяют сгруппировать любую последовательность символов, чтобы в дальнейшем обращается к ним используя выражение \число
, где число - порядковый номер сгруппированной последовательности.
/(la)-\1{2}-\1{3}/g; // Группируем выражение "la" и затем, обращаемся к нему через "\1"
la-laaa-
la-lala-lalala
-lalala-la-la-la
/(la)-\1-(laa)-\2/g;
laa-la-laa-
la-la-laa-laa
-lalal
Чтобы игнорировать сохранение группы используется конструкция (?:)
.
/(?:abc)-(test),\1,\1/g; // В данном случае группа "abc" не будет сохранена, поэтому первый индекс указывает на "test".
abc,test-
abc-test,test,test
-abc-test
Группам можно задавать любые имена. Для этого используется конструкция - (?P<Name>...)
, где Name - название, ... - любая последовательность символов. Для обращения к именованным группам используется конструкция - (?P=Name)
.
/(?P<seven>7{3})-(?P=seven){2}-(?P=seven)/g;
7777-77-7777777-
777-777777-777
-777-7-7-7-7777-7
Если у Вас возникли трудности с пониманием группировки, советую посмотреть данное видео.
Вертикальная черта позволяет указывать альтернативные варианты для поиска. Это чем-то похоже на использование квадратных скобок [abc]
, но только вертикальная черта может работать с целыми словами и выражениями, а не только с отдельными символами.
/yes|no/g;
yes
,maybe,no
,idk,ok
Для того, чтобы использовать в поиске специальные символы {} [] / \ + *. $ ^ |?
, необходимо поставить впереди знак косой черты \
.
/\.|\?/g; // Поиск точек "." или знаков вопроса "?"
What now
?
What next?
Times up.
Wake up.
Символ каретки в регулярном выражении говорит о том, что поиск производится только по началу строк.
/^[0-9]*/gm; // Поиск чисел которые находятся в начале строки
1
. Apples x10
2
. Cookies x5
3
. Eggs x7
Символ доллара в регулярном выражении говорит о том, что поиск производится только по концу строки.
/com$|net$/gm;
google.
com
command
sourceforge.net
netflix
Для более удобного поиска целого класса символов существуют встроенные обозначения.
Обе записи ниже эквивалентны.
/[a-zA-Z0-9_]/g;
/\w/g;
some
random
words
for
example
#@$% *%(^)_
+#1234
/[^a-zA-Z0-9_]/g;
/\W/g;
developer_2022
@
gmail.
com
/[0-9]/g;
/\d/g;
developer_
2022
@gmail.com
/[^0-9]/g;
/\D/g;
developer\_
2022@gmail.com
К пробелам также относятся различные символы переноса строк.
/[\r\n\t\f\v ]/g;
/\s/g;
/[^\r\n\t\f\v ]/g;
/\S/g;
Для того, чтобы найти фразу, которая должна находится до или после другой фразы используются позиционные проверки (lookarounds).
Чтобы найти выражение Х после которого стоит выражение Y, используется конструкция X(?=Y)
.
/\d+(?=€)/g;
200$
750
€ 100$330
€ 550$
Чтобы найти выражение Х после которого НЕ стоит выражение Y, используется конструкция X(?!Y)
.
/\d{4,}(?!€)/g;
This car was costed about 7000€ in
2015
Чтобы найти выражение X перед которым стоит выражение Y, используется конструкция (?<=Y)X
.
/(?<=:)\d+/g;
{ "id":
4
, "value":123
, name:"test" }
Чтобы найти выражение X перед которым НЕ стоит выражение Y, используется конструкция (?<!Y)X
.
/(?<!\$)\d+/g;
$5 $6 $7
2019
2009
1999
Потратьте немного времени на закрепление пройденного материала. Напишите простую библиотеку на Вашем любимом языке программирования, которая будет выполнять валидации (проверки) заданных строк. Например на соответствие электронной почты или номера телефона. Напишите валидатор для паролей, чтобы он соответствовал заданным требованиям по длине, наличию специальных символов, заглавных букв или цифр. Это будет вдвойне полезным занятием, поскольку в будущем вы сможете использовать эту библиотеку в Ваших приложениях.
Дополнительно по запросу в Google – regex practice
, можно найти много интересных заданий на тему регулярных выражений.