Найти в Дзене
Блокнот математика

Рубрика "Секреты Вим". Регулярные выражения. Классы символов

Всем привет, с Вами рубрика "Секреты Вим"! Сегодня мы поговорим о классах символов: вещи полезной, и позволяющей уточнить, что должно совпасть.

Оглавление рубрики

Собственно, символ "точка" (.) тоже класс, включающие в себя все символы, кроме конца строки. Есть еще \_. — это совпадает с любым символом, в том числе и концом строки.

Кстати, есть \n — это символ конца строки, есть $ — это якорь, совпадающий на конце строки, а есть якорь \_$ — о нем чуть позже.
Своего рода класс символов))
Своего рода класс символов))

Классы символов задаются в квадратных скобках: [eyuioa] — гласные.

Можно использовать дефис для задания диапазона: [a-z], [0-9], [i-n]. Поэтому сам дефис, если надо, в классе идет либо первым, либо последним. Если первым символом идет крышка ^, то в класс входят символы, не перечисленные в скобках. В Юникоде это очень большие классы. Важно, что там расстояние между символами ограничено 256. Саму крышку, если нужна, ставим не первой.

Все символы, кроме дефиса и крышки (и то в определенных позициях) и, конечно, слеша и квадратных скобок, означают сами себя.

Если поиск регистронезависимый, регистр роли не играет. Можно поствить \c перед классом, отключив регистр.

Примеры: [A-z] (английский алфавит), [A-Za-z] (он же), [А-яЁё] (русский), [A-z_0-9.] (символы идентификатора в языке R).

Есть много предопределенных классов:

  • \s для пробелов и других невидимых символов. \S это отрицание, то есть не-пробелы, видимые символы.
  • \d для цифр ([0-9]). \D для не-цифр, [^0-9]. Есть аналоги \x, \X (шестнадцатеричные цифры) и \o, \O (восьмеричные).
  • \w для символов слов ([0-9A-Za-z_]). \W — отрицание. \h и \H — то же, но без цифр.
  • \i для символов идентификаторов (они указаны в переменной 'isident'); \I — то же, но без цифр. Это позволяет задать идентификатор: \I\i*
  • \k и \K — то же для ключевых слов (см. 'iskeyword').
  • \f и \F — то же для символов, допустимых для имен файлов (см. 'isfname').
  • \p и \P — печатные символы (см. 'isprint'). Непечатные слова определяйте сами))
  • \a — алфавитный символ, [A-Za-z]. \A — отрицание.
  • \l, \L, \u, \U — символ нижнего регистра, отрицание (то есть всё, кроме [a-z], это не только верхний регистр, а вообще всё, кроме [a-z]), символ верхнего и отрицание. Только для латиницы.

Отметим, что в выражении замены эти же последовательности (\l, \L, \u, \U) значат другое (перевод в нижний-верхний регистр одной буквы или всего текста до конца или до \E) и работают для кодировок также.

Заметим, что несчастная буква ё (и строчная, и заглавная) идет в списке ASCII не по алфавиту, поэтому в диапазон [а-я] НЕ ПОПАДАЕТ. Пишите [а-яё].

Символ конца строки \n может входить в класс (как и табуляция \t и другие подобные символы). К любому классу можно добавить в начале \_ — и тогда в класс автоматически входит конец строки. Упомянутый в начале символ \_$ позволяет использовать якорь "конец строки" в любом месте текста. Ведь $ в середине считается символом доллара. Нужен редко.

Так, возлюб-$ленная совпадет с 'возлюб-$ленная', возлюб-\nленная совпадет, если у вас нормальный перенос, причем при замене символ конца строки будет заменен (на что скажете), а вот возлюб-\_$ленная не совпадет вообще, потому что если совпало \_$, то далее идет всегда конец строки. Но можно так: возлюбленная\_$\_U\+ — слово на строке последнее, а на новой строке первый символ — в верхнем регистре (значит, имя).

Есть более общая конструкция выбора — это \| . Она разделяет два выражения, совпасть может одно из них. Без нее не обойтись в ситуациях вроде function\|subroutine или 42\|666, однако для отдельных символов используйте только класс — выбор весьма неэффективен и хуже читается. Про конструкцию выбора будет отдельный материал.

Еще есть POSIX-классы, не особо полезные на мой взгляд. Громоздкие. Вот они:

[:alnum:], [:alpha:], [:blank:], [:cntrl:], [:digit:], [:graph:], [:print:], [:lower:], [:upper:], [:punct:], [:space:].

Это, соответственно: алфавитно-цифровые, буквы, пробелы и табуляции, управляющие символы, цифры, печатные символы (без пробела и с ним), нижний и верхний регистр, знаки препинания и невидимые символы. Есть еще отдельные символы: [:return:], [:tab:], [:escape:], [:backspace:]. Все это относится только к ASCII, то есть к английскому тексту или коду программ. Эти выражения надо ставить вместе со скобками внутрь класса, то есть [[alpha]] или, например, [.6[:upper:]] совпадет с [A-Z], с точкой или шестеркой.

Куда полезнее класс с игнорированием акцентов: [=a=], вместо a можно указать любую букву и всё это идет в квадратных скобках. Так, [[=a=]] отловит эту букву без различия акцентов! То есть, совпадет и a, и á, и à, и â, и ä.

Примеры

\d\d\d\d\([.\/-]\)[01]\?\d\1[0-2]\?\d — поиск дат. Четыре цифры (год), потом значок . или / или -, потом необязательный 0 или 1, потом цифра (месяц; причем допустимо и 19, мы не гонимся за точностью), потом тот же разделитель, потом еще цифра или две, причем первая меньше 3 (это день).

[а-я]\+ — русское слово без ё.

[a-z][a-z0-9]* — идентификатор (буква, потом буквы и цифры).

Удачи, коллеги!

Путеводитель по каналу

Наука
7 млн интересуются