正規表現入門 — よく使うパターンと書き方

正規表現(regular expression/regex)は、文字列のパターンを短い式で記述するための小さな言語です。検索・抽出・置換・入力チェックなど、テキストを扱う場面で広く使われます。本記事では、文字クラス・メタ文字・量指定子・グループ・アンカー・フラグといった基本要素を整理し、メール/電話/URL/日付の簡易パターンや、ReDoS などの注意点までを JavaScript の構文を基準にまとめます。

はじめに:正規表現は「短く書けること」より「読めること・正しく絞れること」が大事です。複雑な式を 1 行で書ききるより、目的に合わせて適度に分解し、必ず実例で検証しながら組み立てるのが安全です。本記事のコード例はすべて JavaScript 構文(/パターン/フラグ)を基準にしています。

1. 正規表現とは

正規表現は、「数字が 3 桁続く」「@ を含むメールらしい形」のような文字列の条件を、記号を組み合わせた式で表すしくみです。JavaScript では /パターン/フラグ というリテラル、または new RegExp("パターン", "フラグ") で作ります。

たとえば「cat という並び」を探すだけなら、そのまま /cat/ と書きます。文字をそのまま並べた部分はその文字自身にマッチします。主な使い方は次のとおりです。

ここから先は、パターンを構成する記号(メタ文字)の意味を順に見ていきます。記号としての意味を消して「ただの文字」として扱いたいときは、直前に \(バックスラッシュ)を置いてエスケープします。たとえば . 自体を表したいなら \. と書きます。

2. 基本要素 — 文字クラス・メタ文字・量指定子

正規表現の土台は、「どの文字に」「いくつ」マッチさせるかを表す記号です。順に見ていきます。

文字クラス [ ] と \d \w \s

文字クラス[ ] の中に候補を列挙し、そのいずれか 1 文字にマッチします。- で範囲、先頭の ^ で否定を表せます。

よく使う文字クラスには短縮表記があります。大文字にすると「その否定」になります。

表記意味否定形
\d数字 1 文字(基本的に 09\D(数字以外)
\w単語構成文字(a-z A-Z 0-9 _)1 文字\W(単語構成文字以外)
\s空白文字(スペース・タブ・改行など)1 文字\S(空白以外)

メタ文字 . ^ $

メタ文字は特別な意味を持つ記号です。代表的なものを挙げます。

量指定子 * + ? {n,m}

量指定子は、直前の要素を何回繰り返すかを表します。

表記意味
*0 回以上ab*cacabcabbc
+1 回以上ab+cabcabbc …(ac は不可)
?0 回または 1 回colou?rcolorcolour
{n}ちょうど n 回\d{4} は数字 4 桁
{n,m}n 回以上 m 回以下\d{2,4} は数字 2〜4 桁

貪欲マッチと控えめマッチ

量指定子は既定で貪欲(greedy)に動き、条件を満たす範囲でできるだけ長くマッチします。直後に ? を付けると控えめ(lazy)になり、できるだけ短くマッチします。

「思ったより広い範囲が取れてしまう」ときは、貪欲マッチが原因のことがほとんどです。*?+? のように ? を足して控えめにするか、[^>]+ のように区切り文字を除外した文字クラスを使うと、意図どおり絞り込めます。

3. グループとキャプチャ — ( ) 後方参照・名前付き

丸括弧 ( ) は複数の要素をひとまとまりにします。グループには量指定子をまとめてかけられ、さらにマッチした部分を取り出す(キャプチャ)機能もあります。

後方参照

キャプチャした内容は、同じパターン内で \1\2 …(番号は括弧の出現順)として後方参照できます。直前に出た文字列の繰り返しを表すのに使います。

名前付きキャプチャ

番号の代わりに名前を付けると読みやすくなります。(?<name>...) でキャプチャし、match 結果の groups から name で取り出せます。同じパターン内の後方参照は \k<name>、置換文字列では $<name> です。

例:(?<year>\d{4})-(?<month>\d{2}) は、groups.yeargroups.month で年・月を取り出せます。

4. アンカーと境界 — ^ $ \b

アンカーは文字そのものではなく「位置」にマッチします。幅を持たない(文字を消費しない)のが特徴です。

たとえば ^\d+$ は「全体が数字だけ」という条件を表します(先頭から末尾まで数字 1 文字以上)。アンカーを付けないと「どこかに数字を含む」だけになり、入力チェックには不十分です。

単語単位で探したいときは \b が便利です。\bcat\bcat という単語にはマッチしますが、category の一部にはマッチしません。逆に /cat/ だけだと category にも一致してしまう点に注意してください。

5. フラグ — g i m s u

フラグはパターン全体の挙動を変えるオプションで、リテラルでは末尾の / の後ろに付けます(例:/abc/gi)。代表的なものを示します。

フラグ名前効果
gglobal最初の 1 件で止めず、すべての一致を対象にする
iignoreCase大文字・小文字を区別しない
mmultiline^$各行の先頭・末尾に適用する
sdotAll.改行にもマッチするようになる
uunicodeUnicode を正しく扱う(絵文字などのコードポイント単位、\u{...} 記法)

たとえば「大文字小文字を無視して、すべての cat を探す」なら /cat/gi です。フラグは組み合わせて指定でき、順序は問いません。

6. よく使う実例 — メール・電話・URL・日付

ここまでの要素を組み合わせた、実務でよく見る簡易パターンを表にまとめます。いずれも厳密な仕様準拠ではなく、あくまで実用上の目安です。本当に正確な検証が必要な場合(特にメール)は、専用のライブラリや実際の送信確認を併用してください。

対象簡易パターン(例)説明
メール(簡易)^[^\s@]+@[^\s@]+\.[^\s@]+$「空白と @ 以外+@+ドメイン+.+TLD」という最低限の形。厳密な RFC 準拠ではない
電話(日本・ハイフン区切り)^0\d{1,4}-\d{1,4}-\d{4}$0 始まりで、数字とハイフンの簡易形。桁数は地域で異なるため目安
URL(http/https)^https?:\/\/[^\s]+$http または httpss?)に続き、空白を含まない文字列。/\/ でエスケープ
日付(YYYY-MM-DD 形式)^\d{4}-\d{2}-\d{2}$桁数の形だけを確認。「13 月」などの論理的な妥当性は別途チェックが必要
パターンは「形」しか見ません。たとえば日付の ^\d{4}-\d{2}-\d{2}$2026-13-99 も通します。存在しない月日や、メールの実在性のような意味の妥当性は正規表現の守備範囲外です。形のチェックと値の検証は分けて考えましょう。

7. 注意点 — 過剰な複雑化と ReDoS

正規表現は強力ですが、書きすぎると読めなくなり、性能問題も招きます。最後に実務上の注意点をまとめます。

まとめると、正規表現は「小さく・読めるように・実例で検証しながら」が基本です。文字クラスと量指定子、アンカー、フラグの 4 つを押さえれば、日常的なパターンの多くはカバーできます。

Free Tool 正規表現テスターで実際に試す パターンとフラグを入力し、対象テキストへの一致やキャプチャ結果をブラウザ内でその場で確認できます。書いた式をすぐ検証できます。

よくある質問(FAQ)

正規表現とは何ですか?

正規表現(regular expression/regex)は、文字列のパターンを記述するための小さな言語です。「数字が3桁続く」「@ を含むメールらしい形」のような条件を短い式で表し、検索・抽出・置換・検証(バリデーション)などに使います。多くのプログラミング言語やエディタに組み込まれており、JavaScript では /パターン/フラグ のリテラルや RegExp オブジェクトで扱います。

\d と \w の違いは何ですか?

\d は数字 1 文字(基本的に 0〜9)にマッチします。\w は「単語構成文字」で、英数字(a〜z、A〜Z、0〜9)とアンダースコア _ の 1 文字にマッチします。つまり \w は \d を含み、さらに英字とアンダースコアも対象に含む、より広い文字クラスです。どちらも大文字にすると否定(\D は数字以外、\W は単語構成文字以外)になります。

貪欲マッチとは何ですか?

量指定子(* + ? {n,m})は既定で「貪欲(greedy)」に動き、条件を満たす範囲でできるだけ長くマッチしようとします。たとえば <.+> は最初の < から最後の > までをまとめて取り込みます。直後に ? を付けて *? +? ?? {n,m}? とすると「控えめ(lazy)」になり、できるだけ短くマッチします。<.+?> なら最初の > までで止まります。

← 技術ブログ一覧へ戻る