ベタ打ちの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)
続く
追って掲載。