Spec-Zone.ru › Elisp

Пример сложного регулярного выражения

Вот сложное регулярное выражение, которое раньше использовалось в 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

Spec-Zone.ru

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