背景:
我有一个小的(目前不到100个)但正在增长的正则表达式集合,我想优化确定给定文本字符串的过程我的集合中哪些RE与文本字符串匹配.
一些RE有一个排序关系 - 例如,如果我知道字符串$ t匹配/ windows/i,那么我也知道$ t匹配/windows.*2000/i.因此,当我对我的集合中的RE测试$ t时,我可以跳过测试/ windows/i,如果我已经针对/windows.*2000/i测试了$ t并找到了匹配(尽管如果/windows.*2000/i确实如此)不匹配当然我不能跳过对/ windows/i的测试.
请注意,我的集合中的所有RE都不是完全等效的(对于任何一对RE,至少有一个匹配一个的文本字符串与另一个不匹配).
战略:
我想构建一个有向图G,其中有一个节点用于我的集合中的每个RE,并且每对RE的有向边具有排序关系(A - > B表示"匹配A意味着与B匹配"),并找到一个图的节点的"最小生成集"(节点S的最小集合,使得G中的每个节点位于源自S的有向路径上).
简单的部分:
有很多免费的算法可用于定向非循环图.因此,一旦为我的RE集合构建了图形G(这是不同的,应该保证G是非循环的),我不希望找到一个合适的算法来寻找G的最小生成集.
在哪里我需要帮助:
我想找到一种有效的方法来查找我的集合中的RE之间的所有排序关系 - 也许还要确保集合中没有两个RE是等价的(我需要一种方法来自动验证这个,因为新的RE是添加).
因此,我的(基本上是随机的)网络搜索至少提出了一个合理的说法,即确定两个RE之间存在什么(如果有的话)排序关系的合理方法确实存在,但尚未发现任何完整算法的描述.
有没有人知道现有的实现(用于比较RE),这些实现是合理有效的,可免费获得的,并且(理想情况下)是用一种流行的脚本语言或C/C++实现的?
目标: 我对在PHP 程序中生成类依赖项的DOT 格式描述感兴趣。
IDEA: 编写一个 CodeSniffer“嗅探”应该不难,它可以检测(并发出 DOT 记录)PHP 源代码中的以下模式:
class SomeClassName extends BasicClassName { // SomeClassName refers to BasicClassName
...
new OtherClassName(); // SomeClassName refers to OtherClassName
ThisClassName::some_method(); // SomeClassName refers to ThisClassName
ThatClassName::$some_member; // SomeClassName refers to ThatClassName
RandomClassName::some_constant; // SomeClassName refers to RandomClassName
...
}
Run Code Online (Sandbox Code Playgroud)
但是我还没有找到任何发布的嗅探来发出这些信息(以及任何其他表明我可能错过的“真实”类依赖关系的模式)。
注意: 我特别不关心 PHP 的 include() 和 require() 语句(我不相信它们的行为甚至是明确定义的)。出于这个问题的目的,我们假设所有 PHP 类解析都是通过自动加载处理的,并且我们希望仅使用静态代码分析来构建类依赖关系图。
编辑: 不幸的是,我看不到处理以下问题的一般方法:
class ThatClassName {
...
function generateClassName() {
// something too complicated …Run Code Online (Sandbox Code Playgroud) 以下脚本演示了文档(在标题注释中),即我无法检测到"expected"和"actual"字符串之间的任何区别:
<?php
/*
$ phpunit MyTest.php
PHPUnit 3.4.0 by Sebastian Bergmann.
F
Time: 0 seconds
There was 1 failure:
1) MyTest::test_print_r
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-O:7:"MyClass":2:{s:13:"MyClassvar3";N;s:4:"var1";N;}
+O:7:"MyClass":2:{s:13:"MyClassvar3";N;s:4:"var1";N;}
.../MyTest.php:41
.../bin/phpunit:54
FAILURES!
Tests: 1, Assertions: 1, Failures: 1.
*/
class MyClass {
static protected $var2;
private $var3;
public $var1;
public function foo($item) {
echo $item . "\n";
}
}
class MyTest extends PHPUnit_Framework_TestCase {
function test_print_r() {
$m = new MyClass();
$this->assertEquals(trim('O:7:"MyClass":2:{s:13:"MyClassvar3";N;s:4:"var1";N;}'), trim(serialize($m))); …Run Code Online (Sandbox Code Playgroud)