正则表达式碰撞检测

时间:2014-11-17 17:22:33

标签: php regex optimization preg-match

如果存在任何字符串e1,请说两个正则表达式e2s 冲突,这样{{1} }和e1匹配e2

是否有任何简单(有效)的方法来检查两个正则表达式是否发生冲突而不迭代我们字典中所有可能字符串的集合?

注1:我不知道这是否在文献中以其他方式被调用。也许我只是缺少正确的名称来搜索它。

注2:对我来说理想的答案是编写PHP代码,但我接受任何建议,不一定是PHP。

1 个答案:

答案 0 :(得分:1)

因此,经过进一步的研究,在文献中看起来这被称为正则表达式交集

这是可能的,显然它并不难实现,但似乎没有正式的PHP支持。

实现简单算法的关键在于将正则表达式转换为有限自动机。阅读附加链接以更好地理解解决方案。

Stackoverflow相关问题:

Intersection of two regular expressions

Calculate if two infinite regex solution sets don't intersect

PHP的非官方库:

https://github.com/KendallHopkins/FormalTheory

编辑:使用Kendall Hopkins库添加代码段以检查交叉点:

function doRegexIntersection($regex_string_1, $regex_string_2) {
    $lexer = new FormalTheory_RegularExpression_Lexer();
    $nfa1 = $lexer->lex( $regex_string_1 )->getNFA();
    $nfa2 = $lexer->lex( $regex_string_2 )->getNFA();
    return FormalTheory_FiniteAutomata::intersection( $nfa1, $nfa2 )->validSolutionExists();
}