正则表达式匹配除给定列表之外的所有单词

我正在尝试编写一个替换正则表达式来包围引号中的所有单词,除了单词AND,OR和NOT。

我已经尝试了以下表达式的匹配部分:

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

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

但都没有工作。 替换表达式很简单,目前包含所有单词。

 "${word}" 

所以

这和这不是那个

“这个”和“这个”不是“那个”

这有点脏,但它有效:

 (? 

用简单的英语,这匹配任何不在前面的单词边界,而不是“and”,“or”或“not”。 它只匹配整个单词,例如单词“sand”之后的位置不会是匹配,因为它前面是“and”。

零宽度后视断言中“或”前面的空间对于使其成为固定长度的后视是必要的。 如果这已经解决了您的问题,请尝试

编辑:应用于字符串“除了单词AND,OR和NOT。” 作为单引号的全局替换,返回:

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

约翰,

你问题中的正则表达式几乎是正确的。 唯一的问题是你将前瞻放在正则表达式的末尾而不是开头。 此外,您需要添加单词边界以强制正则表达式匹配整个单词。 否则,它将匹配“和”中的“nd”,“或”等中的“r”,因为“nd”和“r”不在您的负向前瞻中。

(我)(?!和|不能|或)\ B(?[A-Z0-9] +)\ b

叫我疯了,但我不是战斗正则表达的粉丝; 我将我的模式限制为我能理解的简单事物,并经常为其余部分作弊 – 例如通过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 + "\""); }); 

(编辑更简洁的布局)

根据Tomalaks答案:

 (? 

这个正则表达式有两个问题:

  1. (?仅适用于固定长度的后视

  2. 之前的正则表达式仅查看周围单词的结尾/开头,而不是整个单词。

(?

这个正则表达式修复了上述两个问题。 首先将后视分为三个独立的后视镜。 其次是在环视中添加单词边界( \b )。

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

我使用这个正则表达式来查找不在双引号内的所有单词,或者单词“not”“和”或“或”。