-2

我有一棵嵌套哈希树,每个哈希树都包含一个名称,就像带有文件的嵌套目录一样。如果我在运行时获得外国提供的正则表达式(我不想分析),我如何才能找到在哪些子树中查找匹配项。匹配的路径可能是以下形式

"$x{name}/$x{subdir}{name}/$x{subdir}{subdir}{name}"

但是,因为可能有数以千计的哈希,我只想在这两个部分匹配时尝试它:

"$x{name}"
"$x{name}/$x{subdir}{name}"

或者更好的是,如果第 1 部分匹配,则尝试直接继续使用第 2 部分,然后使用第 3 部分,有点像/\G.../g,除了正则表达式来自其他地方。而且我需要回溯以查看所有其他部分匹配的子目录。

PCRE g_match_info_is_partial_match听起来正是我正在寻找的东西,但尽管该名称中有“Perl”,但即使 5.18 源似乎也不包含此内容。我实际上想要向后兼容 5.8.0 的东西。

这个问题的背景是将正则表达式语法引入makepp。我们基本上是为模式这样做的,但由于它们的语法很简单,这很容易。请注意,我们缓存了我们找到的文件,并且可以处理出现的更多文件。这使 makepp 能够匹配可能稍后构建的文件,因为它也将规则的输出放入树中。

4

1 回答 1

0

Perl 正则表达式和 PCRE 相互启发,但并不真正兼容并且完全不一样。Perl 使用自定义的正则表达式引擎。

正则表达式匹配,或者不匹配。如果正则表达式失败,则无法判断匹配失败的位置,除非正则表达式是以报告位置的方式编写的。

唯一可行的解​​决方案是要求一个正则表达式列表,每个级别一个。

否则,您可能会要求用户以部分匹配也可以工作的方式编写正则表达式。在这种情况下,qr|foo/bar\.txt$|必须重写正则表达式

qr|\A /                # anchor at start
  (?: [^/]*/       )*  # match as many directories as neccessary
  (?: foo/bar\.txt )?  # maybe match an ending foo/bar.txt
\z|x                   # anchor at end

例子:

for ("/a/", "/a/b/", "/a/b/foo/", "/a/b/foo/bar.txt", "/a/b/foo/baz.txt", "/a/bar.txt") {
  say qq("$_" -- ), /$regex/ ? "matches" : "doesn't match";
}

输出:

"/a/" -- matches
"/a/b/" -- matches
"/a/b/foo/" -- matches
"/a/b/foo/bar.txt" -- matches
"/a/b/foo/baz.txt" -- doesn't match
"/a/bar.txt" -- doesn't match

显然,这不会以任何方式减少此正则表达式的搜索空间。

您可能能够以适合您的应用程序的方式旋转它。根据您的应用程序提供的保证,您可以将原始正则表达式自动转换为“始终”匹配的内容。

于 2013-08-06T23:33:32.477 回答