В этом уроке мы познакомимся с символьными классами — специальными обозначениями, которые задают поиск любого символа из определенного набора.
Символьные классы, обозначаемые квадратными скобками [] в регулярных выражениях, служат для определения набора символов, один из которых должен совпадать с символом в строке. Они позволяют более гибко и компактно задавать условия для поиска.
К примеру, мы можем задать шаблон, чтобы найти слова по шаблону:
/ [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]/
java 11_34-1938 tab
new line
https://regex101.com/r/M8go1R/1
- В строке java:
j,a - В строке tab:
a
В символьных классах можно использовать механизм отрицания. Если мы ставим символ ^ перед первым символом в квадратных скобках, то начинается инвертированный поиск — мы находим все символы, кроме перечисленных после ^:
/ [^aj]/
java 11_34-1938 tab
new line
Если наряду с буквами алфавита необходимо найти дефис, то нужно указать его в начале или конце группы символов. Тогда он не будет восприниматься как специальный символ:
/ [aj-]/
java 11_34-1938 tab
new line
В регулярных выражениях часто используются специальные предопределенные символьные классы. Они записываются с помощью символа \ и имеют свои обозначения в языке регулярных выражений.
В прошлом уроке мы использовали \ для экранирования. Здесь же он используется как часть обозначения. Давайте найдем в тексте все цифры с помощью обозначения класса цифр \d:
/ \d/
java 11_34-1938 tab
new line
Если мы укажем заглавную букву D, то в результате поиска получим все остальные символы — в том числе, пробелы и табуляцию:
/ \D/
java11_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
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.