Backlink | Photo by Quentin Rey on Unsplash
Javascriptの鬼門は正規表現かもしれない。
replace
s = s.replace("、", "。")
Javascriptのreplaceは「文字列の置換」をします。 なので上のように文字列を並べると「、」を「。」に置き換えます。
これが基本系ですね。 でも1回限りです。 該当するところ全部の置換にならない。
そこで正規表現が出てきます。
s = s.replace(/、/g, "。")
g は global で「全部」を意味します。 文字列は "文字列" と囲みますが、正規表現は /文字列/ になります。 囲む記号にスラッシュを使います。 「大文字小文字を無視」だと i 、「各行ごと」だと m をつけて表します。
特殊な記号
正規表現には特別な記号が多いです。
まずMarkdownのリストを考えてみます。 リストを平文に戻す置換は下記になります。
s = s.replace(/- /mg, "")
いえいえ、リストを表すのは -
だけとは限りません。
*
も +
もリストとして用います。
どれにも対応できるようにしましょう。
s = s.replace(/[-\*\+] /mg, "")
[]
で括ると「その中のどれか」という意味になります。
実は *
も +
も正規表現では意味があります。
ただの文字として扱うには \
をつけて無効化する必要があります。
これを「エスケープ」と呼びます。
Markdownの見出しを考えてみましょうか。
#
が並んでレベルを表します。
もし見出し記号を削除したい場合は次のようになります。
s = s.replace(/#+ /mg, "")
+
は「直前の文字が複数ある場合」を意味します。
なので #
も ##
も ######
も #+
で表現できる。
これが「正規表現」になります。
ただ、このままだと文中の #
も対象になってしまいます。
それは困りますよね。
なので「行頭」を意味する ^
を追加します。
s = s.replace(/^#+ /mg, "")
これで見出し記号のみを消すことができました。
参照
消すだけでなく参照したいときもあります。
たとえばURLアドレスをリンク形式に変換する場合。
s = s.replace(/^(https?:\/\/.*)/mg, "[link]($1)")
https://
で始まる文字列なら [link](https://なんたら)
に書き換える。
参照したい部分は ()
で囲みます。
複数箇所を設定できて、$1, $2, $3... で再利用できます。
今回は一箇所だけなので置換後の文字列に $1 で埋め込んでいます。
^
は「行頭」でしたよね。
行頭から http
が始まっていることが条件になります。
途中 s?
としているのは https
だけじゃなく http
の場合もあるからです。
?
は「直前の文字はあってもなくてもいい」という意味です。
\/\/
となっているのは //
のこと。
/
が正規表現の区切り記号なので \
をつけてエスケープしています。
でないと「どこまでが正規表現?」と混乱してしまう。
そして .*
。
これは「文字列ならなんでも」の意味です。
ワイルドカード。
.
だけだと「一文字だけなんでも」ですが *
をつけると「無限になんでも」になります。
「以下省略」のときに .*
をよく使います。
まとめ
以上の項目を押さえると、正規表現は「読める」ようになります。
それ以上先は「こんな場合はどう書くんだろう?」とつまずいてから探す。 ネット上に誰かが「実例」を挙げています。 それを参考に自分で書いてみる。
覚える必要はないですね。 なんとなく当たりをつけることができるようになる。 すると正規表現は書けるようになります。