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
