4

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

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来验证这样的输入吗?

4

3 回答 3

2

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

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

我认为有一些扩展的正则表达式形式可以添加必要的功能,您可以匹配任意嵌套的括号。我不得不承认我对它们中的任何一个都不太熟悉,因为它们的使用很快就会变得更加复杂,而不仅仅是围绕一组更简单的匹配编写一些循环逻辑。

于 2013-07-02T07:27:16.690 回答
1

只匹配"1 and 2 or 4",没有括号:

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

接下来,代替 each \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

于 2013-07-02T07:34:06.887 回答
0

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

于 2013-07-02T07:33:29.210 回答