正则表达式匹配除给定列表之外的所有单词
我正在尝试编写一个替换正则表达式来包围引号中的所有单词,除了单词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答案:
(?
这个正则表达式有两个问题:
-
(?仅适用于固定长度的后视
-
之前的正则表达式仅查看周围单词的结尾/开头,而不是整个单词。
(?
这个正则表达式修复了上述两个问题。 首先将后视分为三个独立的后视镜。 其次是在环视中添加单词边界( \b
)。
(?!\bnot\b|\band\b|\bor\b|\b\"[^"]+\"\b)((?<=\s|\-|\(|^)[^\"\s\()]+(?=\s|\*|\)|$))
我使用这个正则表达式来查找不在双引号内的所有单词,或者单词“not”“和”或“或”。