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

Вот сложное регулярное выражение, которое ранее использовалось Emacs для распознавания конца предложения вместе с любым последующим пробельным символом. (В настоящее время Emacs использует аналогичное, но более сложное регулярное выражение по умолчанию, созданное функцией sentence-end. См. Стандартные регулярные выражения, используемые при редактировании.)

Ниже мы сначала показываем регулярное выражение как строку в синтаксисе Lisp (чтобы отличить пробелы от символов табуляции), а затем результат его вычисления. Строковый констант начинается и заканчивается двойными кавычками. ‘\"’ обозначает двойную кавычку как часть строки, ‘\\’ — обратный слеш как часть строки, ‘\t’ — табуляция, и ‘\n’ — новая строка.

"[.?!][]\"')}]*\\($\\| $\\|\t\\|  \\)[ \t\n]*"
     ⇒ "[.?!][]\"')}]*\\($\\| $\\|  \\|  \\)[
]*"

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

Это регулярное выражение содержит четыре части последовательно и может быть расшифровано следующим образом:

[.?!]

Первая часть шаблона — это выражение в квадратных скобках, которое сопоставляет любой из трех символов: точку, вопросительный знак и восклицательный знак. Соответствие должно начинаться с одного из этих трех символов. (Здесь один из моментов, где новое значение по умолчанию, используемое Emacs, отличается от старого. Новое значение также допускает некоторые не-ASCII символы, которые завершают предложение без последующих пробелов.)

[]\"')}]*

Вторая часть шаблона соответствует любым закрывающим фигурным скобкам и кавычкам, ноль или более раз, которые могут следовать за точкой, вопросительным знаком или восклицательным знаком. \" — это синтаксис Lisp для двойной кавычки в строке. Символ ‘*’ в конце указывает, что непосредственно предшествующее регулярное выражение (выражение в квадратных скобках в данном случае) может повторяться ноль или более раз.

\\($\\| $\\|\t\\|  \\)

Третья часть шаблона соответствует пробельным символам, которые следуют за концом предложения: концом строки (возможно, с пробелом), или табуляцией, или двумя пробелами. Двойные обратные слеши обозначают круглые скобки и вертикальные черты как синтаксис регулярного выражения; скобки определяют группу, а вертикальные черты разделяют альтернативы. Знак доллара используется для сопоставления концом строки.

[ \t\n]*

Наконец, последняя часть шаблона соответствует любым дополнительным пробельным символам, выходящим за рамки минимума, необходимого для завершения предложения.

В нотации rx (см. Структурированная нотация регулярных выражений rx) регулярное выражение можно было бы написать

(rx (any ".?!")                    ; Пунктуация, завершающая предложение.
    (zero-or-more (any "\"')]}"))  ; Закрывающие кавычки или скобки.
    (or line-end
        (seq " " line-end)
        "\t"
        "  ")                      ; Два пробела.
    (zero-or-more (any "\t\n ")))  ; Необязательный дополнительный пробел.

Поскольку регулярные выражения rx — это просто S-выражения, их можно форматировать и комментировать как таковые.