【发布时间】:2013-09-09 12:10:05
【问题描述】:
我正在尝试在 50,000 字的降价文档中超链接 400 个左右的关键字。
这是 Perl“构建链”中的几个步骤之一,因此在 Perl 中实现超链接也是理想的。
我有一个单独的文件,其中包含所有关键字,并将每个关键字映射到应替换为的 markdown 片段,如下所示:
keyword::(keyword)[#heading-to-jump-to]
上面的例子暗示了源 Markdown 文档中出现“keyword”的任何地方,都应该用 markdown 片段“(keyword)[#heading-to-jump-to]”代替。
忽略作为其他关键字的子字符串出现的关键字、复数/单数形式和模棱两可的关键字,它相当简单。但自然地,还有两个额外的限制。
我只需要匹配以下关键字的实例:
- 不在未开始的行上#
- 不是最直接在要跳转到的标题下方
这些简单的英文意思是:不要匹配任何标题中的关键字,也不要替换它们将链接到的标题下的关键字。
我的 Perl 脚本读取 $keyword::$link 对,然后逐对将它们替换为正则表达式,然后用该正则表达式搜索/替换文档。
我已经使用 Regex Buddy 的 JGSoft 正则表达式实现编写了一个进行匹配的正则表达式(对于迄今为止我手动测试过的情况)。它看起来像这样:
Frog::(Frog)[#the-frog)
-->
([Ff]rog'?s?'?)(?=[\.!\?,;: ])(?<!#+ [\w ]*[Ff]rogs?)(?<!#+ the-frog)(?<!#+ the-frog[^#]*)
问题(或者,也许,一个问题)它使用了 Perl 不支持的可变长度回溯。所以我什至无法在完整的文档上测试这个正则表达式,看看它是否真的有效。
我已经阅读了许多关于如何解决可变长度回溯的其他帖子,但我似乎无法针对我的特定情况做出正确的选择。任何常驻 regex 向导都可以帮助提供将在 Perl 中执行的更整洁的 regex 吗?
【问题讨论】:
标签: regex perl lookbehind variable-length