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-2026 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