Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.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
C中的正则表达式:中间有字符串的匹配模式_C_Regex_Match_Boolean Logic - Fatal编程技术网

C中的正则表达式:中间有字符串的匹配模式

C中的正则表达式:中间有字符串的匹配模式,c,regex,match,boolean-logic,C,Regex,Match,Boolean Logic,因此,我试图使用C中的RegEx最小化布尔表达式 我需要一个规则表达式来匹配XXX和XXX,其中“XXX”在两端是相同的,例如,我需要匹配: ((p OR q) AND (p OR q)) 但是不是匹配 (p AND (p OR q)) 因为AND的右边实际上不是左边的那个,所以我可以用 (p OR q) 我想我得到了替换位,但我需要常规表达式来匹配所述内容 谢谢:)您可以使用以下内容: (.+?)(?: AND \1)+ 然后,只需替换为第一个捕获组的内容 请注意,您可以在图案的开头添

因此,我试图使用C中的RegEx最小化布尔表达式

我需要一个规则表达式来匹配XXX和XXX,其中“XXX”在两端是相同的,例如,我需要匹配:

((p OR q) AND (p OR q))
但是不是匹配

(p AND (p OR q))
因为AND的右边实际上不是左边的那个,所以我可以用

(p OR q)
我想我得到了替换位,但我需要常规表达式来匹配所述内容


谢谢:)

您可以使用以下内容:

(.+?)(?: AND \1)+
然后,只需替换为第一个捕获组的内容

请注意,您可以在图案的开头添加
(?s)
,以允许点匹配换行符

这里有一个更防水的图案:

(?s)(.+?)(?:\s+AND\s+\1)+
要删除表达式周围可能的括号,可以使用:

(?s)(\(\s*)(.+?)(?:\s+AND\s+\2)+(?(1)\s*\))
请注意,您必须多次应用此替换(直到不再有匹配项)才能获得所需的结果,因为您可以有重叠的匹配项。例如:

(((p OR q) AND (p OR q)) AND ((p OR q) AND (p OR q)))

正则表达式用于描述属于命名语言类的字符串

特别是,
WxW
格式的字符串不是规则的。你可以用这个来证明。也就是说,相同的模式字符串由
x
分隔。事实上,您要描述的模式是如何证明语言非正则性的关键示例之一

然而,您描述的模式可以由上下文无关语法(相当于一个下推自动机)生成。特别是解析器


由于
WxW
不属于正则语言类,因此不可能有一个正则表达式来描述它。

正如Casimir所提到的,我要寻找的正则表达式是:

(.+) AND \\1
我用这个方法得到了这些结果:

[INPUT] -> [OUTPUT]
r AND (q AND q) -> r AND q
r AND ((q) AND (q)) -> r AND (q)
r AND ((q OR w) AND (q or w)) -> r AND (q OR w)
r AND ((q OR w) AND (q or t)) -> r AND ((q OR w) AND (q or t))

谢谢:)

关于
((p或q)和(p或q)以及(p或q))
呢?我认为您需要构建自己的解析器,而不是说它在PCRE中是不可能的……您想要匹配由
分隔的相同模式字符串?@HamZa((p或q)和(p或q)以及(p或q)和(p或q))将第一时间减少到((p或q)和(p或q))。第二次到((p或q))@sanjeevmk是的,确实不是那个投了否决票的人,但我想再加一点通知。你在大学里学的正则表达式在现实生活中是不一样的。基本上,当你遇到PCRE、.NETRegex和其他很多东西时,你可以扔掉你学到的东西。正则表达式不再是“常规的”。这篇文章读得很好@HamZa谢谢!我没有意识到,通过使用编程语言构造,正则表达式也可以描述非正则语言。