php - 正则表达式碰撞检测

标签 php regex optimization preg-match

假设两个正则表达式 e1e2 碰撞 如果存在任何字符串 s,这样e1e2 都匹配 s

有没有简单(有效)的方法来检查两个正则表达式是否冲突,而无需遍历字典中所有可能字符串的集合?

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

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

最佳答案

所以,经过进一步研究,这似乎是文献中称为正则表达式交集

这是可能的,显然也不难实现,但似乎没有正式的 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();
}

关于php - 正则表达式碰撞检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26978270/

相关文章:

php - Wordpress,为所有链接添加一个 <span> 标签

c# - C#正则表达式问题

C++:优化没有副作用的函数

ios - 如何以针对不同尺寸显示器的模式排列多个 UIView

c++ - 通过 Visual Studio 整体程序优化提高性能

php - Laravel Homestead SQLSTATE[HY000] [2002] 服务器移动后连接被拒绝

php - Laravel 5.7 的 index.php 中定义的 LARAVEL_START const 的实际用法是什么?

c# - 当单词以方括号等特殊字符开头或结尾时,单词边界不匹配

PHP 从 GET 中获取多个具有相同名称的值

jquery - 使用jquery从字符串中提取数字