Регулярное выражение, чтобы соответствовать всем словам, кроме данного списка - PullRequest
18 голосов
/ 28 октября 2008

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

Я попробовал следующее для совпадения части выражения:

(?i)(?<word>[a-z0-9]+)(?<!and|not|or)

и

(?i)(?<word>[a-z0-9]+)(?!and|not|or)

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

"${word}"

Итак

Это и это не то

становится

«Это» и «Это», а не «То»

Ответы [ 5 ]

14 голосов
/ 28 октября 2008

Это немного грязно, но работает:

(?<!\b(?:and| or|not))\b(?!(?:and|or|not)\b)

В простом английском языке это соответствует любой границе слова, которой не предшествует и за которой не следует "и", "или", или "не" Это соответствует только целым словам, например позиция после слова «песок» не будет совпадением только потому, что ей предшествуют «и».

Пространство перед "или" в утверждении о возврате нулевой ширины необходимо для того, чтобы сделать его задним числом фиксированной длины. Попробуйте, если это уже решает вашу проблему.

РЕДАКТИРОВАТЬ: применяется к строке "кроме слов И, ИЛИ и НЕ." как глобальная замена одинарными кавычками, это возвращает:

'except' 'the' 'words' AND, OR and NOT.
5 голосов
/ 02 ноября 2008

Джон,

Регулярное выражение в вашем вопросе почти правильно. Единственная проблема заключается в том, что вы ставите заглядывание в конец регулярного выражения, а не в начало. Кроме того, вам нужно добавить границы слов, чтобы регулярное выражение совпадало с целыми словами. В противном случае он будет совпадать с «nd» в «и», «r» в «или» и т. Д., Поскольку «nd» и «r» не относятся к вашему негативному прогнозу.

\ б (я?) (И |?! Не | или) (? [А-z0-9] +) \ б

3 голосов
/ 28 октября 2008

Назовите меня сумасшедшим, но я не фанат боевых регулярных выражений; Я ограничиваю свои шаблоны простыми вещами, которые я могу понять, и часто обманываю остальных - например, через MatchEvaluator:

    string[] whitelist = new string[] { "and", "not", "or" };
    string input = "foo and bar or blop";
    string result = Regex.Replace(input, @"([a-z0-9]+)",
        delegate(Match match) {
            string word = match.Groups[1].Value;
            return Array.IndexOf(whitelist, word) >= 0
                ? word : ("\"" + word + "\"");
        });

(отредактировано для более краткого макета)

2 голосов
/ 28 октября 2008

На основании ответа Томалакса:

(?<!and|or|not)\b(?!and|or|not)

У этого регулярного выражения есть две проблемы:

  1. (?<! ) работает только для просмотра фиксированной длины

  2. Предыдущее регулярное выражение смотрело только на конец, конец / начало окружающих слов, а не на целое слово.

(?<!\band)(?<!\bor)(?<!\bnot)\b(?!(?:and|or|not)\b)

Это регулярное выражение решает обе вышеуказанные проблемы. Сначала разделив оглядку на три отдельных. Во-вторых, добавив границы слов (\b) внутри оглядки.

0 голосов
/ 14 апреля 2009
(?!\bnot\b|\band\b|\bor\b|\b\"[^"]+\"\b)((?<=\s|\-|\(|^)[^\"\s\()]+(?=\s|\*|\)|$))

Я использую это регулярное выражение, чтобы найти все слова, которые не заключены в двойные кавычки или слова "не" "и" или "или".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...