Поиск…


замечания

Простые классы

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

В следующих предложениях:

  1. Привет как дела?

  2. Я не могу дождаться 2017 года!

Следующие символы соответствуют:

  1. , , , ' , ? и символ конца строки.

  2. ' , , ! и символ конца строки.

ПРИМЕЧАНИЕ 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}]

В следующих предложениях:

  1. Привет как дела?

  2. Я не могу дождаться 2017 года!

Будут сопоставлены следующие символы:

  1. , , , ' , ? , символ конца строки и все буквы (строчные и прописные).

  2. ' , , ! , символ конца строки и все буквы (строчные и прописные).

Характерный класс и общие проблемы, с которыми сталкивается новичок

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), который включает много непреднамеренных символов после диапазона ASCII 90 (из 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



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow