はじめての正規表現入門(超初心者向け)

こんにちは。takanoです。

今日はすごく便利なのに、意外とみんな使っていない正規表現について、簡単にまとめてみたいと思います。
(※とっつきやすくするために厳密ではない部分もあるので、あらかじめご了承ください)

正規表現さえ覚えればテキストエディタでの文字の加工や、Google アナリティクスやデータポータルなどのツールでの複雑な URL 指定などがものすごく捗るので、ぜひこの機会に学んでみてください。

正規表現とは

ものすごくざっくり書くと、メタ文字と呼ばれる記号を使って下記2つのことをして、それによってある文字の集まりから特定のパターンを表現することです。

  1. 文字列の定義
  2. 繰り返しの指定

また、文字の集まりの中に正規表現で表したパターンが該当することを「マッチする」と言います。

この時点で少し難しそうですよね。私も最初は「正規表現」という名前からして良く分からなかったです。英語だと regular expression と言うので、しっかり定義が知りたい人は Wikipedia を参照してみてください。

メタ文字って何?

正規表現の中でだけ、特別な意味を持つ記号です。

メタ(meta-)とは、「高次な-」「超-」「-間の」「-を含んだ」「ーを入れた」「-の後ろの」等の意味の接頭語。 ギリシア語から。

[引用] メタ - Wikipedia

私はメタ文字のことを特殊能力を持った、文字を超えた文字と思っています。その程度の認識で大丈夫です。使えます。
ここからは、メタ文字の中でも特によく使うものを紹介します。

文字列の定義で使うメタ文字

. 文字なら何でも該当
\s 空白全て(スペース・タブ・改行)
^ 文(行)の最初
$ 文(行)の最後
[abc] この中に書いた文字のどれか
[^abc] この中に書いた文字のどれでもない

例えば、abc という文字列にマッチする正規表現を上のメタ文字でいくつか書いてみます。

  1. ... (文字なら何でも3文字)
  2. ^abc$ (最初がaで次がbで最後がc)
  3. [abc][abc][abc](aかbかcが3文字)
  4. [^xyz][^123][^あいう](xでもyでもzでもない文字と1でも2でも3でもない文字と...略)

※ わかりやすくするために大げさに書きました

グルーピング

また用語が出てきました。これはメタ文字の括弧で囲むと文字列を一つのまとまりとして扱えるという機能(?)です。
よく、|(パイプ)のメタ文字と組み合わせて使われます。

(abc) この中に囲んだ内容を一つのまとまりとして扱える
| 「または」や「OR」の意味で、文字列と文字列の間に入れる

エスケープ

正規表現の中でメタ文字にあたる文字を書きたい場合には、「これはメタ文字じゃなくて普通の文字ですよ」と宣言して、メタ文字の特殊能力を発動させないようにします。
このことをエスケープと呼びます。
エスケープには\(バックスラッシュ)というメタ文字を使います。(Windows だと¥のキー)

\ メタ文字の記号を、普通の文字として使いたいときの宣言(目印)

文字列の定義でよく使う書き方

さて、ここまで文字列の定義に使うメタ文字を一通り紹介したので、いろいろ組み合わせて具体的な書き方を紹介します。

[a-z] 英字
[0-9] 数字
[a-z0-9] 英数字
a.c aとcの間に何か1文字ある
^aaa aaaで始まる(最初が一致)
bbb$ bbbで終わる(最後が一致)
[abc] aかbかc
aaa|bbb aaaまたはbbb

しれっと新しいメタ文字を入れてしまいましたが、-(ハイフン)は、上記のように範囲を指定するときのメタ文字です。
(ここじゃないと説明しづらかったので…)

繰り返しの指定で使うメタ文字

さて、残りのメタ文字は繰り返しの指定だけです。
正規表現では、文字列の定義と「それがどれくらいあるか?」を組み合わせて使うことが多いので、まとめて紹介します。

0回以上の繰り返し
? 0回か1回の繰り返し(1つあるかも)
+ 1回以上の繰り返し(1つは必ずある)
{数字} 繰り返し回数を数字で指定

{}(波括弧)は少し使い方が難しいので、いくつか例を挙げます。

  • {1,} 1回以上
  • {1,3} 1回から3回
  • {,3} 3回以下

と、このように,(カンマ)区切りで数字を入れることで繰り返し回数を指定します。

繰り返しの指定でよく使う書き方

ここまでで、正規表現で良く使うメタ文字を一通り紹介したので、組み合わせてみると下記のような指定が可能になります。

[a-z0-9]+ 英数字の1文字以上の繰り返し
a.*b ab または a何とかb(axb,axxb,axxxb...)
(aaa|bbb|ccc){1,3} aaa か bbb か ccc の繰り返しが1~3回
[abc]{2} a か b か c の繰り返しが2回
[a-z]{,30} 英字の繰り返しが0~30回

それ以外の書き方と注意点

例えば特定の URL を指定する場合には、ここまでの内容で一通り足ります。
ただ、使う頻度が少ないのと難易度が高いので今回紹介していない書き方もあります。

もし正規表現に興味を持っていただけたら、ぜひ検索してみてください。

  1. 最長一致欲張りなマッチ)、最短一致控え目なマッチ
  2. 否定先読み否定後読み肯定先読み肯定後読み

最短一致はテキストエディタでの文字加工で、例えば「行頭から改行まで」を指定したい場合に使うかもしれません。
先読み・後読みは「前に〇〇が来ない」などの指定ができるので非常に便利ですが、対応しているツール等が少なく、プログラム言語などで使う場合が多いと思います。
(たしか Google Optimize では使えた記憶が…)

また、今回紹介した範囲は基本的に大丈夫ですが、ツールや言語により微妙に使える正規表現が異なる場合があります。
例えばGoogle データポータルの CASE 文という構文でも正規表現が使えるのですが、エスケープがバックスラッシュ2つだったりします。
(そして日本語ではなく英語のヘルプにしか書いてない)

同様の理由により \D などのメタ文字に関しても、今回は紹介していません。
もし他のメタ文字も知りたい場合は "正規表現 チートシート" などで検索してみてください。

正規表現サンプル集

さて、ここからはより具体的なサンプルを紹介していきたいと思います。
身近なケースとして、Google アナリティクスで使う場合の例です。

URL 構造のグルーピング

まずは URL 構造のグルーピングに使える正規表現を紹介します。
Google アナリティクスの URL 指定では、ドメインが省略された形で入力するのが注意点です。

ページ
スラッシュで終わる場合 ^/[\?$]
ファイル名が付く場合 ^/index\.html
ファイル名が混在する場合 ^/index\.(html?|php)

スラッシュで終わる場合の書き方は、URL パラメータが付くかどうかを考慮しているので、他のケースでも使える書き方です。

ディレクト
aaa または bbb または ccc /(aaa|bbb|ccc)/
aaa配下のbbb と ccc配下のddd /(aaa/bbb|ccc/ddd)/
aaaが含まれる /[^/]*aaa[^/]*/
3階層目以下全て ^/([^/]+/){2}[^\?$]+
URLパラメータ
パラメータ名で指定 [\?&]○○○=
値で指定 [\?&][^=]+=○○○(&|$)
練習問題

さて、唐突ですが練習問題です。

【問題】
パラメータ名:p の、値:1か20か300を指定せよ(値は数字のみとする)

指定したい文字列 ?p=1, ?p=20, ?p=300, &p=1, &p=20, &p=300
解答例

たぶん私だったら、こんな書き方をすると思います。

?か&の後にp=が来て、1か20か300で終わるか数字以外の文字が続く [\?&]p=(1|20|300)($|[^0-9])

キーワードの表記ゆれ

今まで 英数字と記号ばかり取り扱ってきたので、今度は日本語についてもサンプルを用意してみました。
こちらは Google サーチコンソールを Google アナリティクスに連携しているのが前提です。

単語の表記揺れ (口|クチ|くち)(コミ|こみ)
スペース有り無し 九州\s?ラーメン
練習問題

【問題】
渋谷でラーメンを食べようとしている人が検索するクエリを指定せよ

指定したい文字列 渋谷 ラーメン, ラーメン 渋谷, その他種別
解答例

深読みすると、つけ麺も入れるかもしれません。
このあたりは、サーチコンソールで実際に使われている検索クエリ・キーワードをまとめてから正規表現に落とし込むと良いと思います。

「渋谷」と「ラーメン 〇〇」または「〇〇ラーメン」のいずれかの2回の繰り返し ((渋谷|(ラーメン\s)?(醤油|味噌|塩)(\s?ラーメン)?|つけ(麺|そば))\s*){2}

※ 厳密には、”渋谷 渋谷” や "ラーメン ラーメン" もマッチする正規表現ですが、可能性の低さから無視しています

まとめ

以上、はじめての正規表現入門(超初心者向け)でした。
もし間違っている箇所などあれば、ご指摘お願いします。

それから、Google アナリティクスに特化した正規表現の解説記事は下記で読めますので、興味のある方はご一読ください。
(まわし者ではないです)

www.ray-analytics.com

それでは、またいつか!