初めて学ぶ正規表現ガイド(頻出メタ文字の解説)

「正規表現」という言葉を聞いたことがありますか。
正規表現は、文字列の検索・置換・抽出に使える便利な記法です。
一度身につければ、プログラミングだけでなく、ファイル名の一括変更、大量テキストからの情報抽出など、文字データを扱う多くの場面で力を発揮します。普段は手作業で時間がかかる処理も、正規表現なら一瞬で片付くことがあります。
一方で、初見では記号の羅列に見えて難しく感じられるのも事実です。私は苦手でした。この記事では、基本の使い方から実務で役立つテクニックを紹介します。
正規表現とは
正規表現とは、文字列のパターンを一つの文字列として表現するための表記法です。これは、特定の文字や単語、あるいは特定の構造を持つ文字列を探し出したり、別の文字列に置き換えたりするために使われます。
メタ文字の解説
正規表現を扱うにあたり、メタ文字の学習は避けて通れません。メタ文字とは、正規表現で使われる特殊文字のことです。文字そのものではなく「任意の1文字(.)」や「行頭(^)」のような、特定の機能やパターンを表す役割を持ちます。ここでは、よく使うメタ文字を具体例を交えて解説します。
.(ドット:改行以外の任意1文字)
解説:「r → a → 任意の1文字 → n」を表しています。
- マッチする例:
rain/ra3n/ra-n - マッチしない例:
ran(1文字足りない)/raiin(1文字多い)
*(アスタリスク:直前の文字の0回以上の繰り返し)
解説:「r → aが0回以上 → n」を表しています。
- マッチする例:
rn(aが0回)/ran(aが1回)/raaaan(aが4回) - マッチしない例:
rbn(a以外の文字は対象外)/rain(aの繰り返しでもnでもない)
+(プラス:直前の文字の1回以上の繰り返し)
解説:「r → aが1回以上 → n」を表しています。
- マッチする例:
ran(aが1回)/raan(aが2回)/raaaan(aが4回) - マッチしない例:
rn(aが1回以上必要)/rbn(a以外の文字は対象外)
[ ](角括弧:括弧内のいずれか1文字)
解説:「r → aかiかuのいずれか1文字 → n」を表しています。
- マッチする例:
ran/rin/run - マッチしない例:
ren(eは括弧内にない)/rn(1文字足りない)/rain(角括弧内は1文字にしかマッチしないため)
参考:範囲指定
[a-c]ataat/bat/catに一致。
{ }(波括弧:直前の文字の回数を指定)
解説:「r → aが2回 → n」を表しています。
- マッチする例:
raan - マッチしない例:
ran(aが1回で足りない)/raaaan(aが4回で多すぎる)
^(キャレット:行の先頭)
解説:「行の先頭 → c → a → t」を表しています。
- マッチする例:
cat and dog - マッチしない例:
a black cat(行の先頭ではないため) /copycat(途中に cat はあるが先頭ではない)
$(ドル記号:行の末尾)
解説:「c → a → t → 行の末尾」を表しています。
- マッチする例:
a black cat/copycat - マッチしない例:
cat and dog/scatter(行の末尾ではないため)
メタ文字を組み合わせて使う
メタ文字は、組み合わせて使うことができます。複数の機能を組み合わせることで、より高度で実用的な処理が可能になります。先程紹介したメタ文字を組み合わせた例を紹介します。
特定の単語の間に任意の文字列を挟む(".*")
解説:「cat → 任意の文字列 → dog」を表します。この順序で現れる行にマッチします。
- マッチする例:
cat and dog/catdog/the cat chased the big dog - マッチしない例:
dog and cat(順序が逆)/a black cat(dogがない)
桁数と文字種を指定する("[ ]{ }")
解説:「行頭 → 数字3桁 → ハイフン → 数字4桁 → 行末」を表します。
- マッチする例:
135-0064/100-0001 - マッチしない例:
1234567(ハイフンがない)/12-3456(桁数が違う)/〒123-4567(記号を含む)
参考:携帯電話番号
0[7-9]0-[0-9]{4}-[0-9]{4}
070,080,090から始まり、数字4桁-数字4桁
行全体の完全一致を検証する ("^" と "$")
解説:「行頭(^) → 「い」 → 任意の文字列(.*) → 「す」 → 行末($)」を表します。
- マッチする例:
いいおてんきです/いってきます/いぬはかわいいです - マッチしない例:
はい、そうです(始まりが違う)/いぬはかわいい(終わりが違う)
正規表現の作成・勉強に役立つツール
複雑な正規表現は、目視だけでは正しく記述できているかを確認するのが難しいため、ツールを活用するのがおすすめです。
私が利用しているのは、regex101というツールで、正規表現を「書く・試す・学ぶ」を一画面で完結できます。パターンにマッチした部分が色分け表示され、右側に自動解説(Explanation)が出るので、どの記号がどのように効いているかを視覚的に理解できます。
応用編:先読み(Lookahead)・後読み(Lookbehind )、そして、$1、$2、$3・・・
先読み・前方参照(Lookahead)
前方参照は「直後が〜なら(ならないなら)」という条件だけをチェックして、実際の一致範囲には含めない仕組みです。
- 肯定:(?= … ) … 直後がパターンに一致する場合のみマッチ
- 否定:(?! … ) … 直後がパターンに一致しない場合のみマッチ
解説:「円」の直前の数字だけを選択を表します。
- マッチする例:
合計1200円 の 1200 - マッチしない例:
1200ドル(直後が円でない)
後読み・後方参照(Lookahead)
後方参照は「直前が〜なら(ならないなら)」という条件だけをチェックし、実際の一致範囲には含めない仕組みです。
- 肯定:(?<= … ) … 直前がパターンに一致する場合のみマッチ
- 否定:(?<! … ) … 直前がパターンに一致しない場合のみマッチ
解説:@マークの後ろの文字を抽出します
- マッチする例:
info@example.co.jp の example.co.jp - マッチしない例:
https://example.co.jp(@がない)
前方参照・後方参照は一括置換で大活躍
前方参照・後方参照の使い道は、文字の置換です。「ここにだけ入れたい/変えたい」という指定ができるのが強み。指定した文字は、$1、$2、$3というキャプチャを使って表現します。
( )の中の文字が$1に入ります。( )が複数あれば、順番に$2、$3となります。
代表的な使用例
最後に具体的な使用例を紹介します。私が最も活用するのは、エディタでの文字整形ですね。
文字の検索・置換(一括編集)
例えば、日付がYYYY/MM/DD形式とYYYY年MM月DD日が混在している原稿を受理した際に、一括で「年月日」の記法に置換することができます。
.htaccess
ホームページに掲載しているコンテンツを削除・統合した際のリダイレクトルールは、正規表現を使えばシンプルな記述で完結できます。
プログラミング
入力したパスワードが条件をすべて満たすか検証する関数のサンプルコードです。
まとめ
正規表現は、決めたルールで文字を見つけたり置き換えたりするのに便利なノウハウです。この記事で紹介したメタ文字をだけでも広範囲を網羅します。うまくいくか不安なときは、regex101などのツールで確認しましょう。小さな例から試し、少しずつ広げていけば大丈夫です。

