[2021-06-20:加筆・修正しました]
こんにちは。takanoです。
今日はすごく便利なのに、意外とみんな使っていない正規表現について、簡単にまとめてみたいと思います。
(※とっつきやすくするために厳密ではない部分もあるので、あらかじめご了承ください)
正規表現さえ覚えればテキストエディタでの文字の加工や、Google アナリティクスやデータポータルなどのツールでの複雑な URL 指定などがものすごく捗るので、ぜひこの機会に学んでみてください。
正規表現とは
ものすごくざっくり書くと、メタ文字と呼ばれる記号を使って下記2つのことをして、それによってある文字の集まりから特定のパターンを表現することです。
- 文字列の定義
- 繰り返しの指定
また、文字の集まりの中に正規表現で表したパターンが該当することを「マッチする」と言います。
この時点で少し難しそうですよね。私も最初は「正規表現」という名前からして良く分からなかったです。英語だと regular expression と言うので、しっかり定義が知りたい人は Wikipedia を参照してみてください。
メタ文字って何?
正規表現の中でだけ、特別な意味を持つ記号です。
メタ(meta-)とは、「高次な-」「超-」「-間の」「-を含んだ」「ーを入れた」「-の後ろの」等の意味の接頭語。 ギリシア語から。
[引用] メタ - Wikipedia
私はメタ文字のことを特殊能力を持った、文字を超えた文字と思っています。その程度の認識で大丈夫です。使えます。
ここからは、メタ文字の中でも特によく使うものを紹介します。
文字列の定義で使うメタ文字
. | 文字なら何でも該当 |
---|---|
\s | 空白全て(スペース・タブ・改行) |
^ | 文(行)の最初 |
$ | 文(行)の最後 |
[abc] | この中に書いた文字のどれか |
[^abc] | この中に書いた文字のどれでもない |
例えば、abc という文字列にマッチする正規表現を上のメタ文字でいくつか書いてみます。
- ... (文字なら何でも3文字)
- ^abc$ (最初がaで次がbで最後がc)
- [abc][abc][abc](aかbかcが3文字)
- [^xyz][^123][^あいう](xでもyでもzでもない文字と1でも2でも3でもない文字と...略)
※ わかりやすくするために大げさに書きました
グルーピング
また用語が出てきました。これはメタ文字の括弧で囲むと文字列を一つのまとまりとして扱えるという機能(?)です。
よく、|(パイプ)のメタ文字と組み合わせて使われます。
(abc) | この中に囲んだ内容を一つのまとまりとして扱える |
---|---|
| | 「または」や「OR」の意味で、文字列と文字列の間に入れる |
エスケープ
正規表現の中でメタ文字にあたる文字を書きたい場合には、「これはメタ文字じゃなくて普通の文字ですよ」と宣言して、メタ文字の特殊能力を発動させないようにします。
このことをエスケープと呼びます。
エスケープには\(バックスラッシュ)というメタ文字を使います。(Windows だと¥のキー)
\ | メタ文字の記号を、普通の文字として使いたいときの宣言(目印) |
文字列の定義でよく使う書き方
さて、ここまで文字列の定義に使うメタ文字を一通り紹介したので、いろいろ組み合わせて具体的な書き方を紹介します。
[a-zA-Z] | 半角英字 |
---|---|
[0-9] | 半角数字 |
[a-zA-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-Za-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 回 |
それ以外の書き方と注意点
今回紹介した範囲は基本的に大丈夫ですが、ツールや言語により微妙に使える正規表現が異なる場合があるので、 \D などのメタ文字(ショートカット)に関しては、今回は紹介していません。
もし他のメタ文字も知りたい場合は "正規表現 チートシート" などで検索してみてください。
例えば特定の URL を指定する場合には、ここまでの内容で一通り足ります。
ただ、使う頻度が少ないのと難易度が高いので今回紹介していない書き方もあります。
もし正規表現に興味を持っていただけたら、ぜひ検索してみてください。
最短一致はテキストエディタでの文字加工で、例えば「行頭から改行まで」を指定したい場合に使うかもしれません。
先読み・後読みは「前に〇〇が来ない」などの指定ができるので非常に便利ですが、対応しているツール等が少なく、テキストエディタやプログラム言語などで使う場合が多いと思います。
正規表現サンプル集
さて、ここからはより具体的なサンプルを紹介していきたいと思います。
URL 構造のグルーピング
まずは URL 構造のグルーピングに使える正規表現を紹介します。
ページ
スラッシュで終わる場合 | https://example\.com/(\?.+)?$ |
---|---|
ファイル名が付く場合 | https://example\.com/index\.html |
ファイル名が混在する場合 | https://example\.com/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]) |
---|
キーワードの表記ゆれ
今まで 英数字と記号ばかり取り扱ってきたので、今度は日本語についてもサンプルを用意してみました。
単語の表記揺れ | (口|クチ|くち)(コミ|こみ) |
---|---|
スペース有り無し | 九州\s?ラーメン |
半角英数字以外 | [^a-zA-Z0-9] |
練習問題
【問題】
渋谷でラーメンを食べようとしている人が検索するクエリを指定せよ
指定したい文字列 | 渋谷 ラーメン, ラーメン 渋谷, その他あれば |
---|
解答例
深読みすると、つけ麺も入れるかもしれません。
このあたりは、サーチコンソールで実際に使われている検索クエリ・キーワードをまとめてから正規表現に落とし込むと良いと思います。
「渋谷」と「ラーメン 〇〇」または「〇〇ラーメン」のいずれかの2回の繰り返し | ((渋谷|(ラーメン\s)?|(醤油|味噌|塩)(\s?ラーメン)?|つけ(麺|そば))\s*){2} |
---|
※ 厳密には、”渋谷 渋谷” や "ラーメン ラーメン" もマッチする正規表現ですが、可能性の低さから無視しています
各種ツールでの使い方
ここまでの説明だけだとイメージが付きづらいと思うので、実際に有名どころのツールで実演してみます。
サーチコンソール
サーチコンソールでは、「正規表現に一致」だけでなく「一致しない」オプションもあるので、例えばサイト名やブランド名の指名検索を正規表現にできたら、「指名検索」と「それ以外」の検索パフォーマンスを簡単に比較できます。
Google アナリティクス(ユニバーサル アナリティクス)
GA4 は全然触っていないので分からないのですが、ユニバーサル アナリティクスでは特定のページだけ抜き出したい場合に正規表現が便利です。
「アドバンス検索」から正規表現を選択できるのですが、実は検索窓にそのまま打ち込んでも使えます。
データポータル
データポータルのフィルターだと、正規表現の使い方が 2 パターンあります。
「次と一致する正規表現」は完全一致なので、対象の文字列全て(最初から最後まで)を正規表現で表す必要があります。
「次を含む正規表現」は前述したサーチコンソールや Google アナリティクスの使い方と同様に、部分的に正規表現にマッチする箇所を抽出してくれます。
その他に計算フィールドという機能でも正規表現が使えるのですが、その書き方は他の記事で紹介しているので、興味のある方はぜひ。
※ 計算フィールドではエスケープがバックスラッシュ 2 つになる点は要注意
テキストエディタでの使い方
正規表現の便利な使い方として、文字列の検索だけでなくテキストの加工があります。
ここでは Sublime Text を利用して、いくつか例を紹介します。
改行を |(パイプ)に置換
|(パイプ)は正規表現では「または(OR)」の意味になるので、例えば特定の検索クエリや URL 群を簡単に束ねることができます。
例えば、サーチコンソールでインデックスページがクリックされた検索クエリをエクスポートして |(パイプ)で繋ぐと、簡単に指名検索だけを抽出する正規表現が作れます。
動画で紹介しているように、正規表現に対応したテキストエディタを利用すれば、数秒で置換可能です。
こうした加工を、個人的に「正規表現で正規表現を作る」と呼んでいたりします。
拡張子付きの行を削除
テキストエディタを使った正規表現の指定では、\n(改行)という分かりやすい目印が使えます。
その前提だと、わりと雑に正規表現が書けるので「特定の文字列を含む行の削除」も簡単にできます。
今回は URL のパターンによくある \.(正規表現ではなく、普通の文字としてのドット)が入った行を削除してみました。
注意点は、最後の行にも改行を入れておかないとマッチしないので、あらかじめ空の行を足しておくことです。
パラメータ付きの URL からパラメータだけを抽出
1 つの正規表現で指定するのが面倒だったり無理な場合は、複数回の置換も有効です。
元の文字列と正規表現しだいで、まったく違うテキストに組み替えることも可能です。
「()」(半角括弧)で囲んだ文字列がグループ化されるのはメタ文字の使い方で説明しましたが、このグループを保存して後で呼び出す機能も、言語やツールによって使えます。
この機能を「キャプチャ」と呼び、グループの出現順に応じた番号で呼び出すことができます。
ややこしいので、いったん動画で確認してみてください。
動画の例では \? から始まる URL パラメータをキャプチャして、その部分と改行が出力されるように置換しています。
キャプチャはテキストエディタでの加工でも役立ちますし、データポータルの REGEXP_REPLACE 関数 でも利用できたりします。
なお、Sublime Text には「マクロ」という機能があって、こうした文字列の置換に限らず複数回の操作を記憶→再現できます。
何かのツールでエクスポートしたデータを加工、整形するときなど便利に使えますよ。
URL からドメインを抜き出す
URL の一覧があっても、ドメインの一覧が無くて不便なことありませんか?
正規表現を使えば、簡単にドメイン部分だけ残すように置換できます。
残ったドメイン部分は Excel や Google スプレッドシート等に貼り付けて「重複の削除」を行えば、1 行 1 ドメインのリストに加工できます。
まとめ
以上、はじめての正規表現入門(超初心者向け)でした。
もし間違っている箇所などあれば、ご指摘お願いします。
それから、Google アナリティクスに特化した正規表現の解説記事は下記で読めますので、興味のある方はご一読ください。
(まわし者ではないです)
それでは、またいつか!