【问题标题】:Detecting if two regexes could possibly match the same string [duplicate]检测两个正则表达式是否可能匹配相同的字符串[重复]
【发布时间】:2014-03-25 21:46:38
【问题描述】:

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

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

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

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

【问题讨论】:

  • 当您说“有可能”时,您的意思是程序员可以弄清楚,还是您的意思是算法的建设性证明?
  • 不管怎样。鉴于正则表达式的广度,我什至不确定理论上是否可行。
  • 使用每个 RegEx 匹配的位置和长度来确定重叠。
  • @alpha:请重新阅读帖子。我已经修改了它,所以它更清晰一点。
  • 恐怕,对于 常见情况 没有办法:正则表达式可以匹配无限的字符串集 - 所以这是不确定的问题(因为交集可能无法用有限的计数算法步骤)

标签: regex


【解决方案1】:

基本上,您想测试两个 RegExp 的 交集 是否为非空。由于交集 - 就像补码一样 - 是一个潜在的昂贵操作(它需要确定 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));
}

【讨论】:

    【解决方案2】:

    是的,理论上是可以的。

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

    如果您谈论的更多是 regular language 的形式语言理论定义,我会说应该可以通过将两个正则表达式转换为 DFA 并同时遍历两者以查看匹配的内容。

    【讨论】:

      猜你喜欢
      • 2012-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-13
      • 1970-01-01
      相关资源
      最近更新 更多