正規表現(regular expression/regex)は、文字列のパターンを短い式で記述するための小さな言語です。検索・抽出・置換・入力チェックなど、テキストを扱う場面で広く使われます。本記事では、文字クラス・メタ文字・量指定子・グループ・アンカー・フラグといった基本要素を整理し、メール/電話/URL/日付の簡易パターンや、ReDoS などの注意点までを JavaScript の構文を基準にまとめます。
JavaScript 構文(/パターン/フラグ)を基準にしています。
1. 正規表現とは
正規表現は、「数字が 3 桁続く」「@ を含むメールらしい形」のような文字列の条件を、記号を組み合わせた式で表すしくみです。JavaScript では /パターン/フラグ というリテラル、または new RegExp("パターン", "フラグ") で作ります。
たとえば「cat という並び」を探すだけなら、そのまま /cat/ と書きます。文字をそのまま並べた部分はその文字自身にマッチします。主な使い方は次のとおりです。
- 検索・判定:
/cat/.test("category")は含まれていればtrueを返します。 - 抽出:
"a1b2".match(/\d/g)は["1","2"]のように一致部分を取り出します。 - 置換:
"a-b-c".replace(/-/g, "_")は"a_b_c"になります。
ここから先は、パターンを構成する記号(メタ文字)の意味を順に見ていきます。記号としての意味を消して「ただの文字」として扱いたいときは、直前に \(バックスラッシュ)を置いてエスケープします。たとえば . 自体を表したいなら \. と書きます。
2. 基本要素 — 文字クラス・メタ文字・量指定子
正規表現の土台は、「どの文字に」「いくつ」マッチさせるかを表す記号です。順に見ていきます。
文字クラス [ ] と \d \w \s
文字クラスは [ ] の中に候補を列挙し、そのいずれか 1 文字にマッチします。- で範囲、先頭の ^ で否定を表せます。
[abc]…a・b・cのいずれか 1 文字。[a-z]… 小文字の英字 1 文字(範囲指定)。[^0-9]… 数字以外の 1 文字(先頭の^が否定)。
よく使う文字クラスには短縮表記があります。大文字にすると「その否定」になります。
| 表記 | 意味 | 否定形 |
|---|---|---|
\d | 数字 1 文字(基本的に 0〜9) | \D(数字以外) |
\w | 単語構成文字(a-z A-Z 0-9 _)1 文字 | \W(単語構成文字以外) |
\s | 空白文字(スペース・タブ・改行など)1 文字 | \S(空白以外) |
メタ文字 . ^ $
メタ文字は特別な意味を持つ記号です。代表的なものを挙げます。
.… 任意の 1 文字(既定では改行を除く)。文字としての.を表すには\.とエスケープします。^… 行(文字列)の先頭を表すアンカー(後述)。$… 行(文字列)の末尾を表すアンカー(後述)。|… 「または」。cat|dogはcatかdogにマッチします。
量指定子 * + ? {n,m}
量指定子は、直前の要素を何回繰り返すかを表します。
| 表記 | 意味 | 例 |
|---|---|---|
* | 0 回以上 | ab*c は ac・abc・abbc … |
+ | 1 回以上 | ab+c は abc・abbc …(ac は不可) |
? | 0 回または 1 回 | colou?r は color と colour |
{n} | ちょうど n 回 | \d{4} は数字 4 桁 |
{n,m} | n 回以上 m 回以下 | \d{2,4} は数字 2〜4 桁 |
貪欲マッチと控えめマッチ
量指定子は既定で貪欲(greedy)に動き、条件を満たす範囲でできるだけ長くマッチします。直後に ? を付けると控えめ(lazy)になり、できるだけ短くマッチします。
- 対象文字列が
<a><b>のとき、貪欲な<.+>は最初の<から最後の>まで、つまり<a><b>全体を取り込みます。 - 控えめな
<.+?>は最初の>で止まり、<a>だけにマッチします。
*?・+? のように ? を足して控えめにするか、[^>]+ のように区切り文字を除外した文字クラスを使うと、意図どおり絞り込めます。
3. グループとキャプチャ — ( ) 後方参照・名前付き
丸括弧 ( ) は複数の要素をひとまとまりにします。グループには量指定子をまとめてかけられ、さらにマッチした部分を取り出す(キャプチャ)機能もあります。
- グループ化:
(ab)+はabの 1 回以上の繰り返し(ab・abab…)。 - キャプチャ:
(\d{4})-(\d{2})は 1 番目の括弧に年、2 番目に月をキャプチャします。matchの結果配列やコールバックで参照できます。 - 非キャプチャ:取り出しは不要でグループ化だけしたいときは
(?:...)と書きます。(?:ab)+はキャプチャせずに繰り返しだけまとめます。
後方参照
キャプチャした内容は、同じパターン内で \1・\2 …(番号は括弧の出現順)として後方参照できます。直前に出た文字列の繰り返しを表すのに使います。
(\w)\1… 同じ単語構成文字が 2 回連続(aa・--ではなくooなど)。- 置換でも参照でき、JavaScript の
replaceの置換文字列では$1・$2という表記を使います。
名前付きキャプチャ
番号の代わりに名前を付けると読みやすくなります。(?<name>...) でキャプチャし、match 結果の groups から name で取り出せます。同じパターン内の後方参照は \k<name>、置換文字列では $<name> です。
例:(?<year>\d{4})-(?<month>\d{2}) は、groups.year と groups.month で年・月を取り出せます。
4. アンカーと境界 — ^ $ \b
アンカーは文字そのものではなく「位置」にマッチします。幅を持たない(文字を消費しない)のが特徴です。
^… 先頭の位置。mフラグを付けると各行の先頭になります。$… 末尾の位置。mフラグを付けると各行の末尾になります。\b… 単語境界。単語構成文字(\w)と非単語構成文字(\W)の境目、または文字列の端の位置にマッチします。\B… 単語境界でない位置。
たとえば ^\d+$ は「全体が数字だけ」という条件を表します(先頭から末尾まで数字 1 文字以上)。アンカーを付けないと「どこかに数字を含む」だけになり、入力チェックには不十分です。
\b が便利です。\bcat\b は cat という単語にはマッチしますが、category の一部にはマッチしません。逆に /cat/ だけだと category にも一致してしまう点に注意してください。
5. フラグ — g i m s u
フラグはパターン全体の挙動を変えるオプションで、リテラルでは末尾の / の後ろに付けます(例:/abc/gi)。代表的なものを示します。
| フラグ | 名前 | 効果 |
|---|---|---|
g | global | 最初の 1 件で止めず、すべての一致を対象にする |
i | ignoreCase | 大文字・小文字を区別しない |
m | multiline | ^・$ を各行の先頭・末尾に適用する |
s | dotAll | . が改行にもマッチするようになる |
u | unicode | Unicode を正しく扱う(絵文字などのコードポイント単位、\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 または https(s?)に続き、空白を含まない文字列。/ は \/ でエスケープ |
| 日付(YYYY-MM-DD 形式) | ^\d{4}-\d{2}-\d{2}$ | 桁数の形だけを確認。「13 月」などの論理的な妥当性は別途チェックが必要 |
^\d{4}-\d{2}-\d{2}$ は 2026-13-99 も通します。存在しない月日や、メールの実在性のような意味の妥当性は正規表現の守備範囲外です。形のチェックと値の検証は分けて考えましょう。
7. 注意点 — 過剰な複雑化と ReDoS
正規表現は強力ですが、書きすぎると読めなくなり、性能問題も招きます。最後に実務上の注意点をまとめます。
- 過剰な複雑化を避ける:1 本の式にすべてを詰め込むと、後から読めず修正もできません。複数のステップに分ける、コメント付き(
xフラグのある言語)にする、専用パーサに任せる、といった判断も大切です。 - ReDoS(正規表現 DoS)に注意:
(a+)+や(.*)*のように量指定子が入れ子になったパターンは、特定の入力でバックトラッキングが爆発的に増え、処理が極端に遅くなることがあります。外部入力をそのまま複雑なパターンに通す箇所は特に危険です。 - 対策:入れ子の量指定子を避け、
[^>]+のように文字クラスで範囲を限定し、可能なら入力長に上限を設けます。信頼できないパターンを実行しない設計も有効です。
まとめると、正規表現は「小さく・読めるように・実例で検証しながら」が基本です。文字クラスと量指定子、アンカー、フラグの 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)」になり、できるだけ短くマッチします。<.+?> なら最初の > までで止まります。