Пример сложного регулярного выражения
Вот сложное регулярное выражение, которое раньше использовалось в Emacs для распознавания конца предложения вместе с любыми следующими за ним пробельными символами. (В настоящее время Emacs использует похожее, но более сложное регулярное выражение по умолчанию, создаваемое функцией sentence-end. См. Стандартные регулярные выражения, используемые при редактировании.)
Ниже сначала показано регулярное выражение в виде строки в синтаксисе Lisp (чтобы отличать пробелы от символов табуляции), а затем результат его вычисления. Строковая константа начинается и заканчивается двойной кавычкой. ‘\"’ обозначает двойную кавычку внутри строки, ‘\\’ — обратную косую черту внутри строки, ‘\t’ — символ табуляции, а ‘\n’ — символ новой строки.
"[.?!][]\"')}]*\\($\\| $\\|\t\\| \\)[ \t\n]*"
⇒ "[.?!][]\"')}]*\\($\\| $\\| \\| \\)[
]*"
В выводе символы табуляции и новой строки отображаются как есть.
Это регулярное выражение содержит четыре последовательно расположенные части, которые можно разобрать следующим образом:
[.?!]-
Первая часть шаблона — это выражение в квадратных скобках, которое соответствует любому из трёх символов: точке, вопросительному знаку и восклицательному знаку. Совпадение должно начинаться с одного из этих трёх символов. (В этом состоит одно из отличий нового регулярного выражения по умолчанию, используемого в Emacs, от старого. Новое значение также допускает некоторые символы, не относящиеся к ASCII, которыми заканчивается предложение без последующих пробельных символов.)
[]\"')}]*-
Вторая часть шаблона соответствует любым закрывающим фигурным скобкам и кавычкам — нулю или более таких символов, — которые могут следовать за точкой, вопросительным или восклицательным знаком.
\"— это синтаксис Lisp для двойной кавычки в строке. ‘*’ в конце указывает, что непосредственно предшествующее регулярное выражение (в данном случае выражение в квадратных скобках) может повторяться ноль или более раз. \\($\\| $\\|\t\\| \\)-
Третья часть шаблона соответствует пробельным символам после конца предложения: концу строки (при необходимости с пробелом), символу табуляции или двум пробелам. Двойные обратные косые черты указывают, что круглые скобки и вертикальные черты являются синтаксисом регулярных выражений; круглые скобки ограничивают группу, а вертикальные черты разделяют альтернативы. Знак доллара используется для поиска конца строки.
[ \t\n]*Наконец, последняя часть шаблона соответствует любым дополнительным пробельным символам сверх минимально необходимых для завершения предложения.
В нотации rx (см. Структурированная нотация регулярных выражений rx) это регулярное выражение можно записать так:
(rx (any ".?!") ; Punctuation ending sentence.
(zero-or-more (any "\"')]}")) ; Closing quotes or brackets.
(or line-end
(seq " " line-end)
"\t"
" ") ; Two spaces.
(zero-or-more (any "\t\n "))) ; Optional extra whitespace.
Поскольку регулярные выражения rx — это просто S-выражения, их можно форматировать и комментировать соответствующим образом.
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Regexp-Example.html