C中的正则表达式:中间有字符串的匹配模式
因此,我试图使用C中的RegEx最小化布尔表达式 我需要一个规则表达式来匹配XXX和XXX,其中“XXX”在两端是相同的,例如,我需要匹配: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)+ 然后,只需替换为第一个捕获组的内容 请注意,您可以在图案的开头添
((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谢谢!我没有意识到,通过使用编程语言构造,正则表达式也可以描述非正则语言。