.NET Regex用于布尔逻辑运算符

时间:2016-05-02 22:52:03

标签: .net regex

我有以下.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

1 个答案:

答案 0 :(得分:0)

因为你看起来有点像正则表达式,所以我只想发布 没有实现的正则表达式。

您需要代理更换,这基本上是Dot-Net的回调。
在那里你可以决定要替换什么。

由于事物可以隐藏在引号中,因此通用解决方案总是 匹配你不想要的东西(在这种情况下引用字符串),
移动当前字符串位置超过该点以获得您真正想要的内容。

在委托回调中,只需将引用的组替换为自身,
否则,用你想改变的东西替换你真正想要的东西 在上面。

基本上,

如果组1匹配,则  返回组1 否则
 返回组2 +修改组3

我不知道你实际上想要匹配什么,只是猜测 如果需要,可以将空白边界更改回字边界 将其更改为满足您的需求。

@"(""[^""]*"")|(^\s*)?(?<!\S)(AND|OR)(?!\S)\s*(?(2)|(?=(?:AND|OR)(?!\S)|$))"

Formatted and tested:

    ( " [^"]* " )                 # (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
         )
    )