Scrapboxの別ページリンク記法にマッチする正規表現
linktoのみ検出したい
- o
- x
[りんく](りんく.md)
- 太字
- 太字
- ~~斜体~~
- 存在しないリンク
- /sta
- google(text後)
- google(text前)
- :sta:
- Repl.itでPythonの正規表現reを試す
うーん……
- 一つの正規表現だけで頑張るのは無理がありそう
- n個の正規表現使った方がいいか
- xの方を除外する正規表現を複数用意して、判定したいline(のコピー)を書き換える
- で、最後に、そのコピーに対して、シンプルに
[xxx](xxx.md)
を探す正規表現を使う
- これ使う?
- もうこれ愚直に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 こういう文字列もヒットしてしまう
- ...
- ...
- んー、ちょっとわからん
- ...
- ググる
- Python - Python 正規表現で適切にハッシュタグを抽出したい|teratail
- ダメ。
aaa#aaa
もヒットしちまう
- ダメ。
- 他にヒットした記事も同じ感じでうーん:sta:
- Python - Python 正規表現で適切にハッシュタグを抽出したい|teratail
- 仕方ない、プリプロセスで対処する
#hash
#hash #hash
#hash aaa #hash
#hash #hash #hash
^^ ^^
- ...
[#
を](
を.md) [#
などに変えてしまう、が思いついたんだが](`などに変えてしまう、が思いついたんだが.md)- 原意削がれないよな?
- 対応してみた
- https://github.com/stakiran/scbjson2ghpages/commit/603868e64d57e9e09a94f5976981382e4c620d18
- 実装がエレガントじゃなくて不吉な臭いするけど。。。:sta:
まだ
- codeの中身を弾く