C中的RegEx:匹配模式与中间的字符串

时间:2013-12-20 22:37:42

标签: c regex match boolean-logic

所以,我正在尝试使用 C 中的 RegEx 来最小化布尔表达式。

我需要定期播放以匹配 XXX AND XXX ,其中“ XXX ”两端都是相同的,例如,我需要匹配:< / p>

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

匹配

(p AND (p OR q))

因为AND的右侧不是左侧的那个,所以我只能用

替换它
(p OR q)

我认为我得到了替换位,但是我需要常规表达来匹配那些陈述的内容。

谢谢:)

3 个答案:

答案 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))

谢谢:)