文字列のパターンを記号で表現し、検索や照合に使う記法
正規表現(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 が必要です。
正規表現は実務でとても幅広く使われます。代表的な用途は次のとおりです。
・入力チェック(バリデーション):メールアドレスや電話番号が正しい形式か判定
・検索・置換:エディタやコマンド(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|9 と10通り全部書くのは大変です。[0-9] という記号を使えば、同じことをたった5文字で表せます。
なぜ記号に「特別な意味」があるのか。それはコンピュータが正規表現を処理するとき、特定の記号を「文字そのもの」ではなく「ルールを表す命令」として解釈するように作られているからです。これはプログラミング言語に文法があるのと同じ考え方です。
・[0-9]:「0から9の範囲のどれか1文字」というルール
・.(ドット):「改行以外のどんな1文字でもよい」というルール
・*:「直前のルールを0回以上繰り返す」というルール
身近な例で言うと、メタ文字は「ジョーカー(ワイルドカード)」のあるカードゲームに似ています。ジョーカーはどのカードにでもなれる「特別な1枚」。同様に . はどんな文字にでも一致する「万能パターン」です。文字ではなく「条件の設計図」として読むのが、正規表現を理解する最初のコツです。
正規表現は「文字の形式(パターン)」をチェックするものであり、その内容が現実に正しいかどうかは判定できません。これが正規表現の最大の限界です。
具体的な例を見てみましょう。
・メールアドレス:a@b.com という形式かどうかは調べられますが、そのアドレスが本当に存在するかは分かりません
・郵便番号:999-9999 は形式として正しく見えますが、実在する郵便番号かどうかは正規表現で調べられません
・数値の範囲:「1〜12の月」のような範囲指定は正規表現では難しく、13 が弾けないことがあります
なぜ限界があるのか。正規表現が扱えるのは「文字の並び方というルール」だけだからです。意味の正しさ・実在確認・数値の大小比較などは、正規表現の外(プログラムやデータベース)でチェックする必要があります。使う場面を「形式チェックの道具」と割り切って理解すると、正規表現の役割がはっきり見えてきます。