Пример сложного регулярного выражения
Вот сложное регулярное выражение, которое раньше использовалось в 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-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Regexp-Example.html