ベタ打ちのURLリンクを正規表現でMarkdown形式に変換する
次のようなテキストファイルをHTMLにする場面があります。
・オーディオ買取屋
https://audio.kaitori8.com/
まずは次のようにMarkdown形式にしてから、
- [オーディオ買取屋](https://audio.kaitori8.com/)
つまり、「テキスト→Markdown→HTML」のようにしているのですが、この「テキスト→Markdown」をチカラワザでなく、正規表現でやろうと取り組みました。
なお、Jedit Ωにて検証。こうするといいですよ、ではなく、ダマシダマシこうやってみた、という記事です。
1行目を選択する
まずは1行目。
^(.+)→[\1]のように検索置換してみます。
^は文頭(.+)は任意の文字列。()で囲むことでグループとして扱い、\1にて置換対象とする

その結果、[・オーディオ買取屋]となってしまいます。
「・」が不要です。さらに、このままでは「 https://audio.kaitori8.com/」も検索対象になってしまいます。
「・」を検索対象からはずす
^・(.+)→[\1]のように検索置換すると、無事に[オーディオ買取屋]となりました。
「・」が不要なため、^・(.+)のように()から追い出しました。
1行目と2行目をまたがって検索対象にする
^・(.+)\nとすると、改行コードまでは検索対象にできるのですが、2行目までを連続して検索対象にできません。
調べたところ、[\s\S]で可能そうなので、^・(.+)[\s\S](.+)→[\1](\2)と実行すると、残念ながら、[オーディオ買取屋]( https://audio.kaitori8.com/)のようにスペースが残ってしまいます。
全角スペースを削除する
^・(.+)[\s\S]\s(.+)のように\sを入れてみたら、htmlの前のスペースは消え、[オーディオ買取屋](https://audio.kaitori8.com/)のようにできました。
または、^・(.+)\n[\s\S](.+)のように[\s\S]の前に\nを入れることでも解消。
[\s\S]は「改行を含む任意の1文字」という意味ですので、前者だと改行コードと物理的な改行(次の全角スペースは非対象)。後者だと、まず、\nで改行コードとマッチングし、[\s\S]で物理的な改行と2行目のスペースということでしょうか。
例外的な体裁への対応
前提は、次のようなテキストファイルがあることでした。
・オーディオ買取屋
https://audio.kaitori8.com/
次のように「・」やスペースが入っていないときにも対応できるように考えてみます。
オーディオ買取屋
https://audio.kaitori8.com/
・?のように?を付けることで、「・」がない場合にも対応できますが、これによって対象が広くなりすぎてしまいます。- 2行目の全角スペースも
\s?とすることで、入っていない場合にも対応。 - そこで「2行目にhttpが入る」ことを条件に加えるべく、
(.+)を(.*http.*)としました。 .*http.*は「http」を含む文字列を対象にします。
ここまでのまとめ
- 検索:
^・?(.+)[\s\S]\s?(.*http.*) - 置換:
- [\1](\2)

続く
追って掲載。