正则表达式的逻辑标准

时间:2013-07-02 07:16:51

标签: regex

我有一个输入文本框来输入逻辑条件。
以下是可能的输入:

1 OR 2
1 AND 2
(1 OR 2) AND 3
(1 OR 2) OR 3
(1 AND 2) AND 3
(1 AND 2) OR 3
1 AND (2 OR 3)
1 OR (2 OR 3)
1 AND (2 AND 3)
1 OR (2 AND 3)
(1 OR 2) AND (3 OR 4)
(1 OR 2) OR (3 OR 4)
(1 AND 2) OR (3 AND 4)
(1 OR 2) AND (3 OR 4) AND (5 OR 6)

任何人都可以提供RegEx来验证此类输入吗?

3 个答案:

答案 0 :(得分:2)

假设您可以嵌套括号,则不能使用直接正则表达式执行此操作,因为您无法使用正则表达式验证任意嵌套的括号。

验证此输入的更典型方法是将该过程分为两个步骤。使用一系列正则表达式来标记输入,然后使用简单的语法来验证生成的标记序列。 LALR(1)语法,例如yacc支持的语法使这个问题变得微不足道。

我认为有一些扩展的正则表单形式添加了可以匹配任意嵌套括号的必要功能。我不得不承认我不熟悉它们中的任何一个,因为它们使用起来比使用更简单的一组匹配更简单的循环逻辑变得更加复杂。

答案 1 :(得分:1)

只匹配“1和2或4”,没有括号:

^\d+(?:\s*(?:AND|OR)\s*\d+)*$

接下来,代替每个\d+,也允许使用括号括起来的相同表达式:

^(?:\d+|\(\d+(?:\s*(?:AND|OR)\s*\d+)*\))(?:\s*(?:AND|OR)\s*(?:\d+|\(\d+(?:\s*(?:AND|OR)\s*\d+)*\)))*$

好的 - 它不漂亮,但它有效。显然,这只假设一个级别的括号 正如评论所说,根据您的语言和要求,您可以找到更好的解决方案。

工作示例:http://www.debuggex.com/r/eMBWubl5yAp6hUqQ

答案 2 :(得分:0)

您需要使用我的解决方案循环来解析它。循环此正则表达式(\({0,1}\d+ (OR|AND) \d+\){0,1})并将所有匹配值重新分配为数字(如1)。直到文本中没有匹配(\({0,1}\d+ (OR|AND) \d+\){0,1})。如果您只有数字,则该文本有效,否则无效。