我有以下.NET正则表达式:
(?<!["".])+?\b(AND|OR)\b\)?\s?(?=\1+|\1?$)\1?(?![.""])
它可以很好地找到不在两个单词之间的单词AND或OR,这样我就可以逃脱它们。但是,我正在努力让正则表达式排除运算符用引号括起来的匹配。
因此,例如以下内容不应该匹配,尽管通常情况下它们不在引号中。
"MARS AND VENUS AND" - would match on the last AND
"MARS AND AND AND AND AND OR"- would match on all AND words and OR
答案 0 :(得分:0)
因为你看起来有点像正则表达式,所以我只想发布 没有实现的正则表达式。
您需要代理更换,这基本上是Dot-Net的回调。
在那里你可以决定要替换什么。
由于事物可以隐藏在引号中,因此通用解决方案总是
匹配你不想要的东西(在这种情况下引用字符串),
移动当前字符串位置超过该点以获得您真正想要的内容。
在委托回调中,只需将引用的组替换为自身,
否则,用你想改变的东西替换你真正想要的东西
在上面。
基本上,
如果组1匹配,则
返回组1
否则
返回组2 +修改组3
我不知道你实际上想要匹配什么,只是猜测 如果需要,可以将空白边界更改回字边界 将其更改为满足您的需求。
@"(""[^""]*"")|(^\s*)?(?<!\S)(AND|OR)(?!\S)\s*(?(2)|(?=(?:AND|OR)(?!\S)|$))"
( " [^"]* " ) # (1), Match quoted terms
| # OR
( ^ \s* )? # (2), BOS, used in conditional
(?<! \S ) # Whitespace boundary behind
( AND | OR ) # (3), 'and/or'
(?! \S ) # Whitespace boundary ahead
\s*
(?(2) # Was 'and/or' at the BOS ?
# Yes, then take it
| # or,
# No, must be 'and/or' past it or EOS
(?=
(?: AND | OR ) # 'and/or'
(?! \S ) # Whitespace boundary ahead
| # or,
$ # EOS
)
)