使用boost :: regex(c ++)比较两个正则表达式

时间:2017-08-28 12:43:16

标签: c++ regex boost

假设给出了两个正则表达式字符串:

boost::regex r1 = "[AB]";
boost::regex r2 = "[ABCDEF]";

是否有一种简单的方法可以用boost :: regex确定r1是否是r2的子集?

在上面的例子中,r1是r2的子集。

boost :: regex_match使用字符串和正则表达式参数。但是使用两个正则表达式的东西会很好。

这个问题仅与c ++和boost :: regex库有关。

1 个答案:

答案 0 :(得分:0)

将正则表达式转换为DFA图g1和g2。

定义g1'和g2'与接受状态相反的相同图表。

定义a = g1 x g2'和b = g1' x g2,您可以在其中跟踪输入的两组状态。 a和b的接受状态是在两个源产品图中都接受的状态。

a接受的字符串是r1接受而r2不接受的字符串。

b接受的字符串是r2接受的字符串,r1不接受字符串。

r1是r2的一个子集,当且仅当r1接受的每个字符串也被r2接受。

所以简单地证明a不接受任何字符串来证明r1是r2的子集。

如果你想要严格的子集,还要表明b至少接受一个字符串。

我不知道如何通过提升轻松完成任何这些操作。我不知道这些步骤是否符合" easy"。我怀疑没有,因为这个问题是PSPACE完成的。