【问题标题】:.NET Regex for boolean logic operators用于布尔逻辑运算符的 .NET 正则表达式
【发布时间】:2016-08-27 20:00:04
【问题描述】:

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

【问题讨论】:

  • 没有真正好的方法可以做到这一点。您唯一能做的就是匹配引号和捕获组中不是 AND OR NOT 的内容(对于替换有用),然后匹配 AND OR NOT。这是我在 .net 中知道的唯一避免某些事情的方法。其他使用lookbehinds的方法只是浪费时间而且是错误的。您还可以使用拆分方法(在引号之间拆分内容),然后检查每个部分的 AND OR NOT。
  • @CasimiretHippolyte 非常感谢,终于有人把我从精神错乱中带回来了,我花了三天多的时间试图弄清楚,难怪我感到如此泄气!谢谢你的建议。我很惊讶我认为正则表达式可以处理这样的事情。
  • 我向您发送我对您的具体案例的意见。由于您是初学者,请注意仔细测试人们建议您的任何解决方案(尝试最坏的边缘情况),并花时间充分理解它们。
  • @CasimiretHippolyte 感谢您的所有建议。 :-)

标签: .net regex


【解决方案1】:

由于您似乎对正则表达式有所了解,所以我将发布
没有实现的正则表达式。

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

由于事物可以用引号隐藏,所以一般的解决方案总是
匹配您不想要的内容(在本例中为带引号的字符串),
将当前字符串位置移动到该点之外以获得您真正想要的。

在委托回调中,只需将引用的组替换为自身,
否则,请用您想要更改的内容替换您真正想要的内容
在上面。

基本上,

如果第 1 组匹配,
返回第 1 组
其他
返回第 2 组 + 修改后的第 3 组

我不知道您实际上要匹配什么,只是猜测。
如果需要,将空白边界更改回单词边界。
更改它以适应您的需求。

@"(""[^""]*"")|(^\s*)?(?&lt;!\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
         )
    )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多