Regular Expressions
Классы символов
Поиск…
замечания
Простые классы
Regex | Матчи |
---|---|
[abc] | Любой из следующих символов: a , b или c |
[az] | Любой символ от a до z , включительно (это называется диапазоном ) |
[0-9] | Любая цифра от 0 до 9 включительно |
Общие классы
Некоторые группы / диапазоны символов так часто используются, у них есть специальные сокращения:
Regex | Матчи |
---|---|
\w | Буквенно-цифровые символы плюс символ подчеркивания (также называемый «символами слова») |
\W | Несловные символы (такие же, как [^\w] ) |
\d | Цифры ( более широкие, чем [0-9] включают в себя персидские цифры, индийские и т. Д.) |
\D | Без цифр ( короче [^0-9] так как отбросить персидские цифры, индийские и т. Д.) |
\s | Простые символы (пробелы, вкладки и т. Д.) Примечание : может варьироваться в зависимости от вашего движка / контекста |
\S | Небелые символы |
Отрицательные классы
Каретка (^) после открытия квадратной скобки работает как отрицание символов, которые следуют за ней. Это будет соответствовать всем символам, которые не относятся к классу символов.
Отрицательные классы символов также соответствуют символам прерывания строки, поэтому, если они не должны быть сопоставлены, в класс (\ r и / или \ n) следует добавить специальные символы разрыва строки.
Regex | Матчи |
---|---|
[^AB] | Любой символ, отличный от A и B |
[^\d] | Любой символ, кроме цифр |
Основы
Предположим, у нас есть список команд, названных так: Team A
, Team B
, ..., Team Z
Затем:
-
Team [AB]
: Это будет соответствовать либоTeam A
либоTeam B
-
Team [^AB]
: это будет соответствовать любой команде, кромеTeam A
илиTeam B
Нам часто приходится сопоставлять символы, которые «принадлежат» вместе в каком-то контексте или другом (например, буквы от A
до Z
), и для этого предназначены классы символов.
Совпадение разных, похожих слов
Рассмотрим класс символов [aeiou]
. Этот класс символов можно использовать в регулярном выражении, чтобы соответствовать набору слов с аналогичной точностью.
b[aeiou]t
соответствует:
- летучая мышь
- ставка
- немного
- бот
- но
Он не соответствует:
- бой
- БТТ
- Б.Т.
Классы символов по своему усмотрению соответствуют одному и только одному персонажу за раз.
Совпадение без алфавитно-цифровых символов (класс отрицательных символов)
[^0-9a-zA-Z]
Это будет соответствовать всем символам, которые не являются ни числами, ни буквами (буквенно-цифровые символы). Если символ подчеркивания _
также должен быть отменен, выражение можно сократить до:
[^\w]
Или же:
\W
В следующих предложениях:
Привет как дела?
Я не могу дождаться 2017 года!
Следующие символы соответствуют:
,
,,
'
,?
и символ конца строки.
'
,,
!
и символ конца строки.
ПРИМЕЧАНИЕ UNICODE
Обратите внимание, что некоторые варианты с поддержкой свойств символов Unicode могут интерпретировать \w
и \W
как [\p{L}\p{N}_]
и [^\p{L}\p{N}_]
что означает, что другие буквы Unicode и числовые символы также будут включены (см. документы PCRE ). Вот тест PCRE \w
:
В .NET, \w
= [\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Lm}\p{Mn}\p{Nd}\p{Pc}]
, и обратите внимание, что он не соответствует \p{Nl}
и \p{No}
отличие от PCRE (см. документацию \w
.NET ):
Обратите внимание, что по какой-либо причине строчные буквы Unicode 3.1 (например, 𝐚𝒇𝓌𝔨𝕨𝗐𝛌𝛚
) не сопоставляются.
Java (?U)\w
будет соответствовать сочетанию того, что \w
соответствует в PCRE и .NET:
Совпадение без цифр (класс отрицательных символов)
[^0-9]
Это будет соответствовать всем символам, которые не являются цифрами ASCII.
Если цифры Unicode также должны быть отменены, в зависимости от ваших настроек вкуса / языка можно использовать следующее выражение:
[^\d]
Это можно сократить до:
\D
Возможно, вам потребуется включить поддержку свойств символов Unicode явно, используя модификатор u
или программно на некоторых языках, но это может быть неочевидным. Чтобы явно передать намерение, можно использовать следующую конструкцию (когда доступна поддержка):
\P{N}
Это по определению означает: любой символ, который не является числовым символом в любом скрипте. В отрицательном диапазоне символов вы можете использовать:
[^\p{N}]
В следующих предложениях:
Привет как дела?
Я не могу дождаться 2017 года!
Будут сопоставлены следующие символы:
,
,,
'
,?
, символ конца строки и все буквы (строчные и прописные).
'
,,
!
, символ конца строки и все буквы (строчные и прописные).
Характерный класс и общие проблемы, с которыми сталкивается новичок
1. Класс символов
Класс символов обозначается []
. Содержимое внутри символьного класса рассматривается как single character separately
. например, предположим, что мы используем
[12345]
В приведенном выше примере это означает соответствие 1 or 2 or 3 or 4 or 5
. Говоря простыми словами, это можно понять как or condition for single characters
( стресс на одном персонаже )
1.1 Осторожно!
- В классе символов нет понятия соответствия строки. Итак, если вы используете regex
[cat]
, это не означает, что он должен соответствовать словуcat
буквально, но это означает, что он должен соответствовать либоc
либоa
илиt
. Это очень распространенное недоразумение, существующее среди людей, которые новичок в регулярном выражении. - Иногда люди используют
|
(чередование) внутри класса персонажа, думая, что он будет действовать какOR condition
которое является неправильным. например, используя[a|b]
фактически означает совпадениеa
или|
(буквально) илиb
.
2. Диапазон в символьном классе
Диапазон в символьном классе обозначается знаком -
. Предположим, мы хотим найти любого символа в английских алфавитах от A
до Z
Это можно сделать, используя следующий класс символов
[A-Z]
Это можно сделать для любого допустимого диапазона ASCII или Unicode. Наиболее часто используемые диапазоны включают [AZ]
, [az]
или [0-9]
. Более того, эти диапазоны можно комбинировать в классе символов, как
[A-Za-z0-9]
Это означает, что соответствует любому символу в диапазоне от A to Z
или от a to z
или от 0 to 9
. Заказ может быть любым. Таким образом, приведенное выше эквивалентно [a-zA-Z0-9]
если диапазон, который вы определяете, является правильным.
2.1. Осторожность
Иногда при написании диапазонов от
A
доZ
люди записывают его как[Az]
. В большинстве случаев это неправильно, потому что мы используемz
вместоZ
Таким образом, это означает, что любой символ из ASCII диапазона65
(от A) до122
(из z), который включает много непреднамеренных символов после диапазона ASCII90
(из Z). ОДНАКО ,[Az]
может использоваться для сопоставления всех букв[a-zA-Z]
в регулярном выражении в стиле POSIX, если для определенного языка задано сопоставление.[[ "ABCEDEF[]_abcdef" =~ ([Az]+) ]] && echo "${BASH_REMATCH[1]}"
на Cygwin сLC_COLLATE="en_US.UTF-8"
даетABCEDF
. Если вы установитеLC_COLLATE
наC
(на Cygwin, сделанный сexport
), он даст ожидаемыйABCEDEF[]_abcdef
.Значение
-
внутри класса персонажа является особенным. Он обозначает диапазон, как описано выше. Что, если мы хотим совместить-
символ буквально? Мы не можем его поместить, иначе он будет обозначать диапазоны, если он помещается между двумя символами. В этом случае мы должны поставить-
в запуске класса символов , как[-AZ]
или в конце класса символов , как[AZ-]
илиescape it
, если вы хотите использовать его в середине , как[AZ\-az]
.
3. Отрицательный класс символов
Отрицательный класс символов обозначается [^..]
. Значок каретки ^
обозначает совпадение любого символа, кроме символа, присутствующего в классе символов. например
[^cat]
означает соответствие любому символу, кроме c
или a
или t
.
3.1 Осторожность
- Значение знака каретки
^
отображает отрицание только в том случае, если оно находится в начале класса символов. Если его где-нибудь еще в классе символов, он трактуется как буквальный символ каретки без какого-либо особого значения. - Некоторые люди пишут регулярное выражение, например
[^]
. В большинстве движков регулярных выражений это дает ошибку. Причина, заключающаяся в том, что вы используете^
в исходной позиции, он ожидает, что по крайней мере один символ должен быть отменен. В JavaScript, однако, это допустимая конструкция, соответствующая чему угодно, но ничего , т.е. соответствует любому возможному символу (но диакритики, по крайней мере, в ES5).
Классы символов POSIX
Классы символов POSIX представляют собой предопределенные последовательности для определенного набора символов.
Класс символов | Описание |
---|---|
[:alpha:] | Алфавитные символы |
[:alnum:] | Алфавитные символы и цифры |
[:digit:] | Digits |
[:xdigit:] | Шестнадцатеричные цифры |
[:blank:] | Пространство и вкладка |
[:cntrl:] | Управляющие символы |
[:graph:] | Видимые символы (все, кроме пробелов и управляющих символов) |
[:print:] | Видимые символы и пробелы |
[:lower:] | Строчные буквы |
[:upper:] | Заглавные буквы |
[:punct:] | Знаки пунктуации и символы |
[:space:] | Все пробельные символы, включая разрывы строк |
Дополнительные классы символов, которые будут доступны в зависимости от реализации и / или языка.
Класс символов | Описание |
---|---|
[:<:] | Начало слова |
[:>:] | Конец слова |
[:ascii:] | Персонажи ASCII |
[:word:] | Буквы, цифры и символ подчеркивания. Эквивалентно \w |
Чтобы использовать внутреннюю последовательность скобок (класс символов), вы также должны включить квадратные скобки. Пример:
[[:alpha:]]
Это будет соответствовать одному буквенному символу.
[[:digit:]-]{2}
Это будет соответствовать 2 символам, которые являются либо цифрами, либо -
. Следующее будет соответствовать:
-
--
-
11
-
-2
-
3-
Дополнительная информация доступна на: Regular-expressions.info