Scrapboxの別ページリンク記法にマッチする正規表現

linktoのみ検出したい



うーん……

  • 一つの正規表現だけで頑張るのは無理がありそう
  • n個の正規表現使った方がいいか
    • xの方を除外する正規表現を複数用意して、判定したいline(のコピー)を書き換える
    • で、最後に、そのコピーに対して、シンプルに[xxx](xxx.md)を探す正規表現を使う
  • これ使う?
    • が、問題が二点
    • 1 そもそも他から使えるようI/F整えてない
      • ここに書くのも違うし
    • 2 これは to markdown 用の正規表現であって、純粋にscb記法のリンクを取りたい場合とは文脈が違う
      • たとえばRE_LINK_ANOTHER_PAGEは、(既にmarkdown記法のリンクに変換された後に生成される)[]((の存在を前提とした表現になっている
  • もうこれ愚直にparseした方が早くね?
    • いや、状態遷移ゲーはもうこりごり。。。
  • 実装し直すかー
  • 粗いけどいったんdone


いやハッシュタグがまだ

  • そして難しい
RE_HASHTAG = re.compile(r'( |^|\n|\r)#(.+?)( |$|\n|\r)')
  • ...
    • これだと#hash [#hashみたいにスペース区切りで連続してるケースをキャプチャできん](hash`みたいにスペース区切りで連続してるケースをキャプチャできん.md)
    • どうすれば
    • \b
      • 単語の境界。これはゼロ幅アサーションで、単語の始まりか終わりにのみマッチします。単語は英数文字のシーケンスとして定義されます、つまり単語の終わりは空白か非英数文字として表われます。 正規表現 HOWTO — Python 3.9.4 ドキュメント
      • たぶんこれだ
      • あ、でも日本語も非英数文字なのでダメかな
RE_HASHTAG = re.compile(r'\b#(.+?)\b')
  • ...
    • ...
      • だめ
RE_HASHTAG = re.compile(r'( |^|\n|\r|\b)#(.+?)( |$|\n|\r)')
  • ...
    • ...
      • これだとあああ#ここは検出されないも検出されてしまう
    • ドキュメント見ても無さそうだが
    • 先読みアサーション?
      • (?=...)
      • 肯定先読みアサーション。 ... で表わす正規表現が現在位置でマッチすれば成功し、それ以外の場合失敗します。しかし、表現が試行された場合でもエンジンは先に進みません
      • エンジンを先に進ませないんだよな、つまりは
今起きてるの
 aaa #hash1 #hash2 aaa
    ^^^^^^^^
 aaa #hash1 #hash2 aaa
            ^
          エンジンはここからスタートしてしまう
          しかし #(.+?) みたいな表現にすると aaa#aaa こういう文字列もヒットしてしまう
#hash
#hash #hash
#hash aaa #hash
#hash #hash #hash
     ^^    ^^


まだ

  • codeの中身を弾く