0

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

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

MAR AND SATURN
MAR OR SATURN
"MAR AND SATURN"

AND如果或OR两侧至少有 1 个空白字符加上 1 个非空白字符并且这些字符不是由ORor组成,则不会有任何匹配AND。因此,例如 ..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 ]

AND您会注意到一些示例在or运算符之前、之后或两侧包含空格OR,这些也需要匹配。

我正在使用 .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)(?=\))(?!.*\"")
4

1 回答 1

0

我认为这会做到:

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

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

解释:

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

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