Jazzと読書の日々

iPadを筆記具として使う方法を模索します

はじめての正規表現入門

close-up photography of Joker card|600 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 の場合もあるからです。 ? は「直前の文字はあってもなくてもいい」という意味です。

\/\/ となっているのは // のこと。 /正規表現の区切り記号なので \ をつけてエスケープしています。 でないと「どこまでが正規表現?」と混乱してしまう。

そして .* 。 これは「文字列ならなんでも」の意味です。 ワイルドカード. だけだと「一文字だけなんでも」ですが * をつけると「無限になんでも」になります。 「以下省略」のときに .* をよく使います。

まとめ

以上の項目を押さえると、正規表現は「読める」ようになります。

それ以上先は「こんな場合はどう書くんだろう?」とつまずいてから探す。 ネット上に誰かが「実例」を挙げています。 それを参考に自分で書いてみる。

覚える必要はないですね。 なんとなく当たりをつけることができるようになる。 すると正規表現は書けるようになります。