50,000 ワードのマークダウン ドキュメントで 400 程度のキーワードをハイパーリンクしようとしています。
これは、Perl の「ビルド チェーン」のいくつかのステップの 1 つであるため、Perl でもハイパーリンクを実現することが理想的です。
すべてのキーワードを含む別のファイルがあり、それぞれを次のように置き換える必要があるマークダウンフラグメントにマッピングします。
keyword::(keyword)[#heading-to-jump-to]
上記の例は、ソース マークダウン ドキュメントで「キーワード」が発生する場合は常に、マークダウン フラグメント「(キーワード)[#heading-to-jump-to]」に置き換える必要があることを意味します。
他のキーワードの部分文字列として出現するキーワード、複数形/単数形、あいまいなキーワードを無視すると、かなり単純です。しかし、当然のことながら、2 つの追加の制約があります。
次のキーワードのインスタンスのみを一致させる必要があります。
- 行頭ではない #
- ジャンプする見出しのすぐ下ではない
これらの平易な英語の意味は、次のとおりです。どの見出しのキーワードとも一致せず、リンク先の見出しの下にあるキーワードを置き換えないでください。
私の Perl スクリプトは $keyword::$link のペアを読み取り、ペアごとにそれらを正規表現に置き換え、ドキュメントをその正規表現で検索/置換します。
Regex Buddy の JGSoft 正規表現実装を使用して、マッチングを行う正規表現を作成しました (これまでに手動でテストした場合)。次のようになります。
Frog::(Frog)[#the-frog)
-->
([Ff]rog'?s?'?)(?=[\.!\?,;: ])(?<!#+ [\w ]*[Ff]rogs?)(?<!#+ the-frog)(?<!#+ the-frog[^#]*)
これに関する問題 (または、おそらく問題) は、 Perl でサポートされていない可変長のルックバックを使用していることです。そのため、ドキュメント全体でこの正規表現をテストして、実際に機能するかどうかを確認することさえできません。
可変長のルックバックを回避する方法に関する他の投稿をたくさん読んだことがありますが、特定のケースではうまくいかないようです。常駐の正規表現ウィザードのいずれかが、Perl で実行されるより適切な正規表現を支援できますか?