所以,我正在尝试使用 C 中的 RegEx 来最小化布尔表达式。
我需要定期播放以匹配 XXX AND XXX ,其中“ XXX ”两端都是相同的,例如,我需要匹配:< / p>
((p OR q) AND (p OR q))
但不匹配
(p AND (p OR q))
因为AND的右侧不是左侧的那个,所以我只能用
替换它(p OR q)
我认为我得到了替换位,但是我需要常规表达来匹配那些陈述的内容。
谢谢:)
答案 0 :(得分:1)
您可以使用以下内容:
(.+?)(?: 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)))
答案 1 :(得分:0)
正则表达式用于描述属于名为Regular Language的语言类的字符串。
特别是WxW
形式的字符串不规则。您可以使用the Pumping Lemma for Regular Languages来证明这一点。也就是说,相同的模式字符串由x
分隔。实际上,您想要描述的模式是如何证明非常规语言的关键示例之一。
您描述的模式可以由Context Free Grammar(等效地,下推自动机)生成。解析器,特别是。
由于WxW
不属于常规语言类,因此不能有描述它的正则表达式。
答案 2 :(得分:0)
Casimir提到,我正在寻找的RegEx是:
(.+) 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))
谢谢:)