В этом уроке мы познакомимся с символьными классами — специальными обозначениями, которые задают поиск любого символа из определенного набора.
Рассмотрим принцип работы символьных классов на простом примере. Предположим, что
Символьные классы, обозначаемые квадратными скобками []
в регулярных выражениях, служат для определения набора символов, один из которых должен совпадать с символом в строке. Они позволяют более гибко и компактно задавать условия для поиска.
К примеру, мы можем задать шаблон, чтобы найти слова по шаблону:
/ [cb]at
/
cat
bat
hat cab
https://regex101.com/r/J7f2Fw/1
Символьный класс в квардратных скобках []
ищет один из символов. Также мы указали текст at
, он тоже будет найден.
Но что, если нам нужно найти только буквы алфавита? Для этого использовать только символьные классы в квадратных скобках. К примеру, все буквы английского алфавита в нижнем регистре будут выглядеть так: [a-z]
. Мы видим, что символы алфавита в строке подсветились:
/ [a-z]
/
java
11_34-1938 tab
new line
https://regex101.com/r/9Hmnd6/1
Регулярное выражение /[a-z]/
соответствует любому одному строчному символу английского алфавита. Таким образом, будут найдены следующие совпадения:
- В строке java:
j
,a
,v
,a
- В строке tab:
t
,a
,b
Таким же образом можно задать поиск цифр от нуля до девяти:
/ [0-9]
/
java 11
_34
-1938
tab
new line
https://regex101.com/r/8fvDUW/1
В строке 11_34-1938: 1
, 1
, 3
, 4
, 1
, 9
, 3
, 8
А в этом примере мы укажем только два символа, каждый из которых будет найден:
/ [aj]
/
ja
va
11_34-1938 ta
b
new line
https://regex101.com/r/M8go1R/1
- В строке java:
j
,a
- В строке tab:
a
В символьных классах можно использовать механизм отрицания. Если мы ставим символ ^
перед первым символом в квадратных скобках, то начинается инвертированный поиск — мы находим все символы, кроме перечисленных после ^
:
/ [^aj]
/
jav
a 11_34-1938 t
ab
new line
Если наряду с буквами алфавита необходимо найти дефис, то нужно указать его в начале или конце группы символов. Тогда он не будет восприниматься как специальный символ:
/ [aj-]
/
ja
va
11_34-
1938 ta
b
new line
В регулярных выражениях часто используются специальные предопределенные символьные классы. Они записываются с помощью символа \
и имеют свои обозначения в языке регулярных выражений.
В прошлом уроке мы использовали \
для экранирования. Здесь же он используется как часть обозначения. Давайте найдем в тексте все цифры с помощью обозначения класса цифр \d
:
/ \d
/
java 11
_34
-1938
tab
new line
Если мы укажем заглавную букву D
, то в результате поиска получим все остальные символы — в том числе, пробелы и табуляцию:
/ \D
/
java
11_
34-
1938tab
new line
Для поиска пробельных символов существует класс \s
. В свою очередь, класс \S
обозначает все непробельные символы. Как мы видим, принцип обозначения символьных классов прост:
- Строчная буква обозначает класс
- Заглавная — все, что к нему не относится
Есть еще один популярный класс \w
, который включает в себя все буквы алфавита, все цифры и подчеркивания.
В коде ниже не видно, но пробельные символы не соответствуют этому классу, равно как и -
:
/ \w
/
java
11_34
-1938
tab
new
line
Использование класса \w
равносильно такой записи: [0-9a-zA-Z_]
. Обратите внимание, что при поиске в диапазоне символов важен регистр, поэтому в этой записи после строчных a-z
следуют заглавные A-Z
.
Соответственно, \W
находит инвертированный вариант своей строчной копии. Здесь уже вместе с дефисом будут найдены и пробельные символы:
/ \W
/
java 11_34-
1938 tab
new line

Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.