FE EXAM

正規表現(regex)

文字列のパターンを記号で表現し、検索や照合に使う記法

INTERACTIVE VISUALIZATION
一致部分
非一致
パターン
a*b+
一致した箇所
3
正規表現パターン
テスト文字列
プリセット
マッチを1つずつ表示
マッチ 0/3▶ボタンを押すと、左から見つかった一致部分を1つずつ緑でハイライトします。
テスト文字列とマッチ
aabbb a b ccc bb
解説

📌
正規表現とは

[0-9]+パターン照合abc123xy文字列(123が一致)

正規表現(regular expression, regex)とは、文字列のパターン(型)を記号で表現する記法です。「数字が1つ以上続く部分」「メールアドレスらしい並び」のような条件を短い式で書き、その条件に合う文字列を検索・照合できます。

身近な例えで言うと、正規表現は「お尋ね者の人相書き」のようなものです。「背が高くて黒い帽子をかぶった人」という特徴(パターン)に当てはまる人を群衆の中から探すように、正規表現は「この特徴を持つ文字列」を文章の中から見つけ出します。具体的な1人を指すのではなく、条件に合う「あらゆる該当者」を対象にするのがポイントです。

上のツールでパターンとテスト文字列を入力し▶ボタンを押すと、一致した部分が緑でハイライトされます。[0-9]+a*b+ などのプリセットで、記号の組み合わせがどんな文字列に一致するか確かめてみてください。

🔣
主要メタ文字の意味

正規表現の力はメタ文字(=特別な意味を持つ記号)にあります。ふつうの文字はそのまま「その文字」を表しますが、メタ文字は「繰返し」「いずれか」「位置」などのルールを表します。主要なものを一覧にしました。

記号名前意味
.任意の1文字改行以外の任意の1文字に一致a.c → abc, a7c
*0回以上の繰返し直前の要素を0回以上繰り返すab* → a, ab, abbb
+1回以上の繰返し直前の要素を1回以上繰り返すab+ → ab, abbb(aは不可)
?0回または1回直前の要素があってもなくてもよいab? → a, ab
[ ]文字クラス括弧内のいずれか1文字に一致[0-9] → 数字1文字
( )グループ化まとめて1つの要素として扱う(ab)+ → ab, abab
|選択(または)左右どちらかに一致cat|dog → cat, dog
^行頭文字列(行)の先頭に一致^a → 先頭のa
$行末文字列(行)の末尾に一致z$ → 末尾のz

特に混同しやすいのが繰返しの記号です。
*:直前を0回以上(なくてもよい)
+:直前を1回以上(最低1回は必要)
?:直前が0回または1回(あってもなくてもよい)
たとえば ab*a にも一致しますが、ab+ は最低でも ab が必要です。

🔍
文字列検索での活用

入力チェックの例[0-9]{3}-[0-9]{4}123-4567郵便番号の形式に一致するか判定

正規表現は実務でとても幅広く使われます。代表的な用途は次のとおりです。
入力チェック(バリデーション):メールアドレスや電話番号が正しい形式か判定
検索・置換:エディタやコマンド(grep, sed 等)で特定パターンを探して書き換える
データ抽出:ログやテキストから日付・IPアドレスなどを取り出す

たとえば「3桁の数字 − 4桁の数字」という郵便番号の形式は [0-9]{3}-[0-9]{4} と書けます({n} は「ちょうどn回」を表す回数指定)。これ1つで「123-4567」のような入力が正しい形かを瞬時にチェックできます。

正規表現を読み解くコツは、パターンを左から小さなまとまりに分けて、それぞれが何回繰り返せるか・どの文字に対応するかを順に確認することです。上のツールで実際に一致箇所を見ながら感覚をつかむのが近道です。

💡
なぜ記号(メタ文字)で表すのか

「数字1文字」を表すには?全部列挙(長い)0|1|2|3|4|5|6|7|8|910通り全部書く記号でメタ文字(短い)[0-9]記号1つで「0〜9のどれか1文字」を表せる

メタ文字を使う理由は「短く・一般的に書ける」からです。たとえば「数字1文字」を表したいとき、0|1|2|3|4|5|6|7|8|9 と10通り全部書くのは大変です。[0-9] という記号を使えば、同じことをたった5文字で表せます。

なぜ記号に「特別な意味」があるのか。それはコンピュータが正規表現を処理するとき、特定の記号を「文字そのもの」ではなく「ルールを表す命令」として解釈するように作られているからです。これはプログラミング言語に文法があるのと同じ考え方です。
[0-9]:「0から9の範囲のどれか1文字」というルール
.(ドット):「改行以外のどんな1文字でもよい」というルール
*:「直前のルールを0回以上繰り返す」というルール

身近な例で言うと、メタ文字は「ジョーカー(ワイルドカード)」のあるカードゲームに似ています。ジョーカーはどのカードにでもなれる「特別な1枚」。同様に . はどんな文字にでも一致する「万能パターン」です。文字ではなく「条件の設計図」として読むのが、正規表現を理解する最初のコツです。

⚠️
正規表現の苦手なこと

「パターン」と「意味の正しさ」は別もの形式は正しい99999-9999でも実在しない正規表現では判定できない形式(型)の照合だけが得意。意味の判断はできない

正規表現は「文字の形式(パターン)」をチェックするものであり、その内容が現実に正しいかどうかは判定できません。これが正規表現の最大の限界です。

具体的な例を見てみましょう。
メールアドレスa@b.com という形式かどうかは調べられますが、そのアドレスが本当に存在するかは分かりません
郵便番号999-9999 は形式として正しく見えますが、実在する郵便番号かどうかは正規表現で調べられません
数値の範囲:「1〜12の月」のような範囲指定は正規表現では難しく、13 が弾けないことがあります

なぜ限界があるのか。正規表現が扱えるのは「文字の並び方というルール」だけだからです。意味の正しさ・実在確認・数値の大小比較などは、正規表現の外(プログラムやデータベース)でチェックする必要があります。使う場面を「形式チェックの道具」と割り切って理解すると、正規表現の役割がはっきり見えてきます。

関連コンテンツ