Подтвердить что ты не робот

Regex соответствует всем словам, кроме данного списка

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

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

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

и

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

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

"${word}"

So

Это и это не то

становится

"This" и "This" not "That"

4b9b3361

Ответ 1

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

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

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

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

EDIT: применяется к строке "кроме слов AND, OR и NOT." как глобальная замена одиночными кавычками, это возвращает:

'except' 'the' 'words' AND, OR and NOT.

Ответ 2

Джон

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

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

Ответ 3

Назовите меня сумасшедшим, но я не поклонник регулярного выражения; Я ограничиваю свои шаблоны простыми вещами, которые я могу понять, и часто обманываю для остальных - например, через 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 + "\"");
        });

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

Ответ 4

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

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

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

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

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

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

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

Ответ 5

(?!\bnot\b|\band\b|\bor\b|\b\"[^"]+\"\b)((?<=\s|\-|\(|^)[^\"\s\()]+(?=\s|\*|\)|$))

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