用于匹配不正确的 AND OR 逻辑的正则表达式

Regex for matching incorrect AND OR logic

我需要一个可以匹配不正确的 AND / OR 逻辑语句的正则表达式,但如果它们在引号中则不匹配,例如:

在以下位置找不到匹配项:

MAR AND SATURN
MAR OR SATURN
"MAR AND SATURN"

如果 ANDOR 两边至少有 1 个白色 space 字符加上 1 个非白色 space 字符并且这些字符不是由 ORAND 组成的。因此,例如 ..R AND S.. 不应匹配,但 (OR) OR (OR)(AND) AND (AND) 应该匹配。

匹配

  MARS AND SATURN [AND]
  MARS [OR]
  MARS [ OR ]
  [AND] AND [AND]
  [OR] [AND]
  [OR] [AND]
  [AND] [OR]
  [ AND ] [ OR ]

您会注意到一些示例在 ANDOR 运算符之前、之后或两侧包含白色 space,这些也需要匹配。

我正在使用 .NET 框架,这是我想出的有效方法。不过,好像太复杂了!必须有一种方法来简化它。

(?!.*\"")(?<!(?:\bAND\b\s|\bOR\b\s))(?:\b(?:AND|OR)\b)(?=\s\b(?:AND|OR)\b)|(?<=\bAND\b\s|\bOR\b\s)(?:\b(?:AND|OR)\b)(?!\s\b(?:AND|OR)\b)|^\b(?:AND|OR)\b|(?:AND\s?|OR\s?)$|(?<=\()\s?(?:\bAND\b|\bOR\b)|(?<=\()(?:\bOR|\bAND)(?=\))|(?:\bOR|\bAND)(?=\))(?!.*\"")

我认为这样可以:

^ *'[^']*' *$|^ *"[^"]*" *$|(\b(AND|OR)\b) +(?1)|(?1)\s*$|^\s*(?1)

演示: https://regex101.com/r/nD9yR3/2

解释:

这个正则表达式是为了匹配错误的字符串!!!

  1. (?1) 用于递归正则表达式。它重复第 1 组的正则表达式。
  2. ^ *'[^']*' *$|^ *"[^"]*" *$| 用于忽略引号内的字符串。如果它具有第 1 组而不是第 0 组的值,则认为它是匹配项。