Spec-Zone.ru › Elisp

Специальные символы в регулярных выражениях

Вот список символов, которые являются специальными в регулярном выражении.

‘.’ (Точка)

является специальным символом, который соответствует любому одиночному символу, кроме новой строки. Используя конкатенацию, мы можем создать регулярные выражения, такие как ‘a.b’, которое соответствует любой строке из трех символов, начинающейся с ‘a’ и заканчивающейся на ‘b’.

‘*’

не является конструкцией сам по себе; это постфиксный оператор, который означает соответствие предшествующему регулярному выражению многократно, насколько это возможно. Таким образом, ‘o*’ соответствует любому количеству символов ‘o’ (включая отсутствие символов ‘o’).

‘*’ всегда применяется к наименьшему возможному предшествующему выражению. Таким образом, ‘fo*’ повторяет символ ‘o’, а не ‘fo’. Оно соответствует ‘f’, ‘fo’, ‘foo’ и так далее.

Искатель обрабатывает конструкцию ‘*’ путем соответствия, сразу же, как можно большему количеству повторений. Затем он продолжает с остальной частью шаблона. Если это не удаётся, происходит возврат, отбрасываются некоторые соответствия конструкции, модифицированной ‘*’, в надежде, что это позволит сопоставить остальную часть шаблона. Например, при сопоставлении ‘ca*ar’ со строкой ‘caaar’, ‘a*’ сначала пытается сопоставить все три символа ‘a’; но остальная часть шаблона — ‘ar’, и осталось только сопоставить ‘r’, поэтому эта попытка терпит неудачу. Следующий вариант — чтобы ‘a*’ соответствовало только двум символам ‘a’. С этим выбором остальная часть регулярного выражения успешно сопоставляется.

‘+’

является постфиксным оператором, аналогичным ‘*’, за исключением того, что он должен сопоставить предшествующее выражение по крайней мере один раз. Таким образом, например, ‘ca+r’ сопоставляется со строками ‘car’ и ‘caaaar’, но не со строкой ‘cr’, тогда как ‘ca*r’ сопоставляется со всеми тремя строками.

‘?’

является постфиксным оператором, аналогичным ‘*’, за исключением того, что он должен сопоставить предшествующее выражение либо один раз, либо не сопоставлять вообще. Например, ‘ca?r’ сопоставляется с ‘car’ или ‘cr’; ничего другого.

‘*?’, ‘+?’, ‘??’

являются нежадными вариантами операторов ‘*’, ‘+’ и ‘?’. В то время как эти операторы сопоставляют наибольшую возможную подстроку (совместимую с сопоставлением всего содержащего выражения), нежадные варианты сопоставляют наименьшую возможную подстроку (совместимую с сопоставлением всего содержащего выражения).

Например, регулярное выражение ‘c[ad]*a’, применённое к строке ‘cdaaada’, сопоставляется со всей строкой; но регулярное выражение ‘c[ad]*?a’, применённое к той же строке, сопоставляется только с ‘cda’. (Наименьшее возможное сопоставление здесь для ‘[ad]*?’, которое допускает сопоставление всего выражения, равно ‘d’.)

‘[ … ]’

является альтернативой символов, которая начинается с ‘[’ и завершается ‘]’. В самом простом случае, символы между двумя скобками — это то, что может сопоставить эта альтернатива символов.

Таким образом, ‘[ad]’ сопоставляется либо с одним символом ‘a’, либо с одним символом ‘d’, а ‘[ad]*’ сопоставляется с любой строкой, состоящей только из ‘a’ и ‘d’ (включая пустую строку). Следовательно, ‘c[ad]*r’ соответствует ‘cr’, ‘car’, ‘cdr’, ‘caddaar’ и т. д.

Вы также можете включить диапазоны символов в альтернативу символов, написав начальный и конечный символы с ‘-’ между ними. Таким образом, ‘[a-z]’ сопоставляется с любой строчной буквой ASCII. Диапазоны могут свободно перемешиваться с отдельными символами, как в ‘[a-z$%.]’, что сопоставляется с любой строчной буквой ASCII или ‘$’, ‘%’ или точкой. Однако конечный символ одного диапазона не должен быть началом другого; например, ‘[a-m-z]’ следует избегать.

Альтернатива символов также может указывать именованные классы символов (см. Классы символов). Это функция POSIX. Например, ‘[[:ascii:]]’ сопоставляется с любым символом ASCII. Использование класса символов эквивалентно указанию каждого из символов в этом классе; но последнее не осуществимо на практике, поскольку некоторые классы включают тысячи различных символов. Класс символов не должен появляться в качестве нижней или верхней границы диапазона.

Обычные специальные символы регулярных выражений не являются специальными внутри альтернативы символов. Совершенно другой набор символов является специальным: ‘]’, ‘-’ и ‘^’. Чтобы включить ‘]’ в альтернативу символов, поместите его в начало. Чтобы включить ‘^’, поместите его в любое место, кроме начала. Чтобы включить ‘-’, поместите его в конец. Таким образом, ‘[]^-]’ сопоставляется со всеми тремя этими специальными символами. Вы не можете использовать ‘\’ для экранирования этих трех символов, так как ‘\’ здесь не является специальным.

Следующие аспекты диапазонов специфичны для Emacs, поскольку POSIX допускает, но не требует этого поведения, и программы, отличные от Emacs, могут вести себя иначе:

  1. Если case-fold-search не nil, ‘[a-z]’ также соответствует заглавным буквам.
  2. Диапазон не зависит от порядка сортировки локальной системы: он всегда представляет набор символов с кодами, расположенными между этими границами, так что ‘[a-z]’ сопоставляется только со строчными буквами ASCII, даже вне локали C или POSIX.
  3. Если нижняя граница диапазона больше, чем его верхняя граница, диапазон пуст и не представляет никаких символов. Таким образом, ‘[z-a]’ всегда не соответствует, а ‘[^z-a]’ соответствует любому символу, включая новую строку. Однако обратный диапазон всегда должен быть от буквы ‘z’ до буквы ‘a’, чтобы было ясно, что это не опечатка; например, ‘[+-*/]’ следует избегать, так как он сопоставляется только с ‘/’, а не с предполагаемыми четырьмя символами.
  4. Если конечные точки диапазона являются сырыми байтами 8-бита (см. Представления текста), или если начало диапазона — символ ASCII, а конец — сырой байт (как в ‘[a-\377]’), диапазон будет сопоставляться только со символами ASCII и сырыми байтами 8-бита, но не с не-символами ASCII. Эта функция предназначена для поиска текста в буферах и строках с одним байтом.

Некоторые типы альтернатив символов не являются лучшим стилем, хотя они имеют хорошо определенное значение в Emacs. Они включают в себя:

  1. Хотя граница диапазона может быть почти любым символом, лучше придерживаться естественных последовательностей букв и цифр ASCII, потому что большинство людей не заучили таблицы кодов символов. Например, ‘[.-9]’ менее ясно, чем ‘[./0-9]’, а ‘[`-~]’ менее ясно, чем ‘[`a-z{|}~]’. Экранирование символов Юникода может помочь в данном случае; например, для большинства программистов ‘[ก-ฺ฿-๛]’ менее ясно, чем ‘[\u0E01-\u0E3A\u0E3F-\u0E5B]’.
  2. Хотя альтернатива символов может включать дубликаты, лучше их избегать. Например, ‘[XYa-yYb-zX]’ менее ясно, чем ‘[XYa-z]’.
  3. Хотя диапазон может обозначать всего один, два или три символа, проще перечислить символы. Например, ‘[a-a0]’ менее ясно, чем ‘[a0]’, ‘[i-j]’ менее ясно, чем ‘[ij]’, а ‘[i-k]’ менее ясно, чем ‘[ijk]’.
  4. Хотя ‘-’ может появляться в начале альтернативы символов или как верхняя граница диапазона, лучше поместить ‘-’ отдельно в конце альтернативы символов. Например, хотя ‘[-a-z]’ допустимо, ‘[a-z-]’ — лучший стиль; и хотя ‘[*--]’ допустимо, ‘[*+,-]’ более ясно.
‘[^ … ]’

‘[^’ начинает дополненную альтернативу символов. Это соответствует любому символу, кроме указанных. Таким образом, ‘[^a-z0-9A-Z]’ соответствует всем символам кроме букв и цифр ASCII.

‘^’ не является специальным в альтернативе символов, если это не первый символ. Символ, следующий за ‘^’, рассматривается так, как будто он был первым (другими словами, ‘-’ и ‘]’ там не являются специальными).

Дополненная альтернатива символов может сопоставляться с новой строкой, если новая строка не упоминается как один из символов, которым не следует сопоставляться. Это отличается от обработки регулярных выражений в программах, таких как grep.

Вы можете указать именованные классы символов, точно так же, как в альтернативах символов. Например, ‘[^[:ascii:]]’ сопоставляется с любым символом, не являющимся символом ASCII. См. Классы символов.

‘^’

При сопоставлении с буфером, ‘^’ сопоставляется с пустой строкой, но только в начале строки в сопоставляемом тексте (или в начале доступной части буфера). В противном случае он ничего не сопоставляет. Таким образом, ‘^foo’ сопоставляется с ‘foo’, которое появляется в начале строки.

При сопоставлении со строкой вместо буфера, ‘^’ соответствует началу строки или после символа новой строки.

По соображениям обратной совместимости, ‘^’ может использоваться только в начале регулярного выражения или после ‘\(’, ‘\(?:’ или ‘\|’.

‘$’

аналогичен ‘^’, но сопоставляется только в конце строки (или в конце доступной части буфера). Таким образом, ‘x+$’ сопоставляется с одной или более строкой ‘x’ в конце строки.

При сопоставлении со строкой вместо буфера, ‘$’ сопоставляется с концом строки или перед символом новой строки.

По соображениям обратной совместимости, ‘$’ может использоваться только в конце регулярного выражения или перед ‘\)’ или ‘\|’.

‘\’

имеет две функции: он экранирует специальные символы (включая ‘\’), и он вводит дополнительные специальные конструкции.

Так как ‘\’ экранирует специальные символы, ‘\$’ — это регулярное выражение, которое сопоставляется только с ‘$’, а ‘\[’ — это регулярное выражение, которое сопоставляется только с ‘[’, и так далее.

Обратите внимание, что ‘\’ также имеет специальное значение в синтаксисе чтения строк Lisp (см. Тип строки), и его необходимо экранировать с помощью ‘\’. Например, регулярное выражение, которое сопоставляет символ ‘\’, равно ‘\\’. Чтобы записать строку Lisp, содержащую символы ‘\\’, синтаксис Lisp требует экранировать каждый символ ‘\’ с помощью другого ‘\’. Поэтому синтаксис чтения для регулярного выражения, сопоставляющего ‘\’, равен "\\\\".

Обратите внимание: Для обеспечения обратной совместимости специальные символы обрабатываются как обычные, если они находятся в контекстах, где их специальное значение не имеет смысла. Например, ‘*foo’ обрабатывает ‘*’ как обычный символ, так как нет предшествующего выражения, на которое ‘*’ может действовать. Не рекомендуется полагаться на это поведение; в любом случае используйте экранирование специальных символов, независимо от того, где они появляются.

Так как ‘\’ не является специальным символом внутри альтернативы символов, он никогда не может удалить специальное значение ‘-’ или ‘]’. Поэтому вы не должны экранировать эти символы, когда они не имеют специального значения. Это ничего не прояснит, так как обратные слэши могут законно предшествовать этим символам, где они имеют специальное значение, как в ‘[^\]’ ("[^\\]" для синтаксиса строк Lisp), что соответствует любому одиночному символу, кроме обратного слэша.

На практике большинство ‘]’, встречающихся в регулярных выражениях, закрывают альтернативу символов и, следовательно, являются специальными. Однако иногда регулярное выражение может попытаться сопоставить сложный шаблон литеральных ‘[’ и ‘]’. В таких ситуациях иногда может потребоваться тщательно проанализировать регулярное выражение с самого начала, чтобы определить, какие квадратные скобки заключают альтернативу символов. Например, ‘[^][]]’ состоит из дополненной альтернативы символов ‘[^][]’ (которая соответствует любому одиночному символу, который не является квадратной скобкой), за которой следует литеральный ‘]’.

Точные правила таковы: в начале регулярного выражения ‘[’ является специальным, а ‘]’ — нет. Это длится до первой неэкранированной ‘[’, после которой мы находимся внутри альтернативы символов; ‘[’ больше не является специальным (за исключением случая, когда он начинает класс символов), но ‘]’ является специальным, если он не следует сразу за специальным ‘[’ или если ‘[’ последовал за ‘^’. Это длится до следующего специального ‘]’, который не завершает класс символов. Это завершает альтернативу символов и восстанавливает обычный синтаксис регулярных выражений; неэкранированная ‘[’ снова является специальной, а ‘]’ — нет.

Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Regexp-Special.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API