Я озадачен, пытаясь создать регулярное выражение Emacs, которое исключает группы. [^]
исключает отдельные символы в наборе, но я хочу исключить определенные последовательности символов: что-то как [^(not|this)]
, таким образом, это представляет в виде строки содержащий "не", или "это" не подобрано.
В принципе я мог записать ([^n][^o][^t]|[^...])
, но есть ли иначе, это более чисто?
Прежде всего: [^ n] [^ o] [^ t]
это не решение. Это также исключает такие слова, как nil
( [^ n]
не соответствует), bob
( [^ o]
не соответствует ) или cat
( [^ t]
не соответствует).
Но можно построить регулярное выражение с базовым синтаксисом, которое соответствует строкам, которые не содержат ни , ни
, ни this
:
^([^nt]|n($|[^o]|o($|[^t]))|t($|[^h]|h($|[^i]|i($|[^s]))))*$
Шаблон этого регулярного выражения позволяет любой символ, который не является первым символом слов или только префиксы слов, но не целые слова.
Это нелегко. Регулярные выражения предназначены для сопоставления вещей, и это все, что они могут делать.
Во-первых: [^]
не обозначает «исключающую группу», он обозначает инвертированный класс символов. Классы символов не поддерживают группировку в любой форме или форме. Они поддерживают одиночные символы (и, для удобства, диапазоны символов). Ваша попытка [^ (not | this)]
на 100% эквивалентна [^) (| hinots]
в том, что касается механизма регулярных выражений.
Это можно сделать тремя способами. вывести из этой ситуации:
(not | this)
и исключить любые совпадения с помощью среды, в которой вы находитесь (отрицать результаты совпадений)