Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 逻辑标准的正则表达式_Regex - Fatal编程技术网

Regex 逻辑标准的正则表达式

Regex 逻辑标准的正则表达式,regex,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)

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

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

假设您可以嵌套括号,您不能用直接正则表达式来实现这一点,因为您不能用正则表达式验证任意嵌套的括号

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


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

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

仅匹配“1和2或4”,无括号:

^\d+(?:\s*(?:AND|OR)\s*\d+)*$
^(?:\d+|\(\d+(?:\s*(?:AND|OR)\s*\d+)*\))(?:\s*(?:AND|OR)\s*(?:\d+|\(\d+(?:\s*(?:AND|OR)\s*\d+)*\)))*$
接下来,除了每个
\d+
,还允许使用相同的表达式,并用括号括起来:

^\d+(?:\s*(?:AND|OR)\s*\d+)*$
^(?:\d+|\(\d+(?:\s*(?:AND|OR)\s*\d+)*\))(?:\s*(?:AND|OR)\s*(?:\d+|\(\d+(?:\s*(?:AND|OR)\s*\d+)*\)))*$
好吧,它并不漂亮,但它很管用。显然,这只假设了一个括号级别。
正如评论所说,根据您的语言和要求,您可能会找到更好的解决方案


工作示例:

关于
(5或6和10或6)
@Anirudh,这也是可能的。您测试了什么?你试过什么?你必须尝试一下,而不是简单地要求别人来解决你的问题,首先要试着解决你自己。这是一个有趣的问题,但没有明确说明。例如,
1
等代表什么?这些真的是1位数的整数吗?嵌套是否可能(
(1和(2或3))或4)?你用哪种语言写这个?还有,当解析器看起来更适合这个任务时,为什么要使用正则表达式?@sp00m:为什么不呢?Perl/PCRE、PHP、.NET和其他正则表达式引擎都很好地支持递归。