Как я пишу регулярное выражение, которое исключает, а не соответствует, например, не (this|string)?

Я озадачен, пытаясь создать регулярное выражение Emacs, которое исключает группы. [^] исключает отдельные символы в наборе, но я хочу исключить определенные последовательности символов: что-то как [^(not|this)], таким образом, это представляет в виде строки содержащий "не", или "это" не подобрано.

В принципе я мог записать ([^n][^o][^t]|[^...]), но есть ли иначе, это более чисто?

24
задан ekad 13 March 2017 в 18:30
поделиться

3 ответа

Прежде всего: [^ n] [^ o] [^ t] это не решение. Это также исключает такие слова, как nil ( [^ n] не соответствует), bob ( [^ o] не соответствует ) или cat ( [^ t] не соответствует).

Но можно построить регулярное выражение с базовым синтаксисом, которое соответствует строкам, которые не содержат ни , ни , ни this :

^([^nt]|n($|[^o]|o($|[^t]))|t($|[^h]|h($|[^i]|i($|[^s]))))*$

Шаблон этого регулярного выражения позволяет любой символ, который не является первым символом слов или только префиксы слов, но не целые слова.

16
ответ дан 28 November 2019 в 22:29
поделиться

Это нелегко. Регулярные выражения предназначены для сопоставления вещей, и это все, что они могут делать.

Во-первых: [^] не обозначает «исключающую группу», он обозначает инвертированный класс символов. Классы символов не поддерживают группировку в любой форме или форме. Они поддерживают одиночные символы (и, для удобства, диапазоны символов). Ваша попытка [^ (not | this)] на 100% эквивалентна [^) (| hinots] в том, что касается механизма регулярных выражений.

Это можно сделать тремя способами. вывести из этой ситуации:

  1. match (not | this) и исключить любые совпадения с помощью среды, в которой вы находитесь (отрицать результаты совпадений)
  2. использовать отрицательные заглянем вперед, если это поддерживается вашим механизмом регулярных выражений и возможно в данной ситуации
  3. переписать выражение, чтобы оно могло соответствовать : см. аналогичный вопрос, который я задавал ранее
25
ответ дан 28 November 2019 в 22:29
поделиться

Попробуйте M-x flushh-линии.

6
ответ дан 28 November 2019 в 22:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: