检测两个正则表达式是否可能匹配相同的字符串

时间:2014-03-25 21:46:39

标签: regex

给定两个正则表达式,是否可以检测是否有任何可能的字符串与它们相匹配?

例如,给定正则表达式A.,我可以看到字符串"A"与它们匹配。这是一个简单的案例。

我的问题是更广泛的情况 - 给定任何两个有效的正则表达式,是否有可能明确地说是否有任何可能的字符串与两个正则表达式相匹配?假设没有要测试的输入字符串样本集。我只有正则表达式。我不一定需要生成匹配的字符串 - 我只需要确定有可能的字符串匹配两者。

接受任何常见正则表达式规范的讨论 - .NET,Java,PERL,sed,grep等。

2 个答案:

答案 0 :(得分:3)

基本上,您要测试两个RegExps的交集是否为非空。由于交叉 - 就像补码一样 - 是一种潜在的昂贵操作(它需要确定NFA),因此在许多RegExp实现中并未实现。我所知道的一个例外是BRICS Automaton Library,它允许启用交集运算符&

要测试相关属性,可以使用如下的BRICS(Java)库:

RegExp re = new RegExp("(.) & (a)", RegExp.INTERSECTION); // Parse RegExp
Automaton a = re.toAutomaton(); // convert RegExp to automaton

if(a.isEmpty()) { // Test if intersection is empty
  System.out.println("Intersection is empty!");
}
else {
  // Print the shortest accepted string
  System.out.println("Intersection is non-empty, example: " + a.getShortestExample(true));
}

答案 1 :(得分:1)

是的,理论上可能。

但它基本上归结为尝试所有可能的选项,并查看哪些匹配正则表达式。但它更像是一个理论上的计算机科学问题,在编程语言中使用现代正则表达式,这将是NP中的一个问题(http://en.wikipedia.org/wiki/NP_(complexity)

如果您更多地谈论regular language的形式语言理论定义,那么我应该说将两个正则表达式转换为DFA并同时遍历两者看看会匹配什么。