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"
Ответы
Ответ 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|\*|\)|$))
Я использую это регулярное выражение, чтобы найти все слова, которые не входят в двойные кавычки, или это слова "не" и "или" или. "