ログファイルから特定のエラー行だけ抽出したい、フォームのメールアドレスをバリデーションしたい—— そんなとき「正規表現で書けばいいのはわかるけど、パターンの意味がよく読めない」と詰まった経験はないでしょうか。 正規表現(Regular Expression)は一度覚えてしまえば、grep・VSCode検索・JavaScript・Pythonなど あらゆる場面で使い回せる強力なスキルです。この記事では、基本構文から実践的なパターンまでを順に解説します。
正規表現とは
正規表現とは、文字列のパターンを記号で表現する仕組みです。 「3桁の数字のあとにハイフン、続けて4桁の数字」といったパターンを\d{3}-\d{4} のような短い表記で書けます。
主な用途は次のとおりです。
- 検索・抽出 — grep、VSCode・IntelliJの検索、コマンドライン処理
- バリデーション — メールアドレス・電話番号・郵便番号などの入力チェック
- 置換 — 一括フォーマット変換、テキスト整形
- プログラミング — JavaScript・Python・Ruby・Java・PHPすべてで利用可能
基本メタ文字一覧
正規表現では通常の文字(a〜z、0〜9 など)はそのままマッチし、 特殊な意味を持つ「メタ文字」が制御の役割を担います。
| メタ文字 | 意味 | 例 | マッチする例 |
|---|---|---|---|
| . | 任意の1文字(改行を除く) | a.c | abc, a1c, a_c |
| ^ | 行の先頭 | ^Hello | 行頭の "Hello" |
| $ | 行の末尾 | end$ | 行末の "end" |
| [abc] | a・b・cのいずれか1文字 | [aeiou] | 母音1文字 |
| [^abc] | a・b・c以外の1文字 | [^0-9] | 数字以外の1文字 |
| a|b | aまたはb(OR) | cat|dog | "cat" または "dog" |
| (abc) | グループ化・キャプチャ | (ab)+ | ab, abab, ababab |
| \d | 数字1文字([0-9] と同等) | \d{4} | 2026, 0001 |
| \w | 単語文字([a-zA-Z0-9_]) | \w+ | hello, user_1 |
| \s | 空白文字(スペース・タブ・改行) | \s+ | 空白の連続 |
| \D, \W, \S | それぞれの否定(非数字・非単語・非空白) | \D+ | abc, あいう |
量指定子の違い
量指定子(quantifier)は「直前のパターンが何回繰り返すか」を指定します。 似ているようで動作が異なる種類を整理します。
| 量指定子 | 繰り返し回数 | 例 | マッチする文字列 |
|---|---|---|---|
| * | 0回以上 | ab*c | ac, abc, abbc, abbbc... |
| + | 1回以上 | ab+c | abc, abbc(acはNG) |
| ? | 0回または1回 | colou?r | color, colour |
| {n} | ちょうどn回 | \d{4} | 0000〜9999 |
| {n,m} | n回以上m回以下 | \d{2,4} | 12, 123, 1234 |
| {n,} | n回以上 | \d{3,} | 123, 1234, 12345... |
貪欲マッチと非貪欲マッチ
デフォルトの量指定子は貪欲(greedy)で、できる限り長くマッチします。 量指定子のあとに ? を付けると非貪欲(lazy)になり、最短でマッチします。 例: <.*>(貪欲)vs<.*?>(非貪欲)
よく使うパターン集
実務でよく使う正規表現パターンをまとめました。正規表現テスターで動作を確認しながら学ぶと理解が深まります。
電話番号(日本)
// 固定電話・携帯(ハイフンあり)
/^0\d{1,4}-\d{1,4}-\d{4}$/
// 例: 03-1234-5678 / 090-1234-5678メールアドレス(実用版)
/^[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}$/
// 例: [email protected] / [email protected]郵便番号
/^\d{3}-?\d{4}$/
// 例: 100-0001 / 1000001(ハイフンなし両対応)日本語文字(ひらがな・カタカナ・漢字)
// ひらがな
/[\u3041-\u3096]/
// カタカナ(全角)
/[\u30A1-\u30FA]/
// 漢字(CJK統合漢字)
/[\u4E00-\u9FFF]/
// JavaScriptのES2018以降(uフラグ必須)
/\p{Script=Hiragana}/uグループとキャプチャ
丸カッコ () はパターンをグループ化し、 マッチした部分を取り出す「キャプチャグループ」として機能します。
// JavaScriptでのキャプチャ例
const dateStr = "2026-05-05"
const match = dateStr.match(/(\d{4})-(\d{2})-(\d{2})/)
// match[1] → "2026"(年)
// match[2] → "05"(月)
// match[3] → "05"(日)
// 名前付きキャプチャ(ES2018以降)
const re = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/
const { year, month, day } = "2026-05-05".match(re).groupsグループ化だけしてキャプチャは不要な場合は(?:...)(非キャプチャグループ)を使います。 マッチ結果の番号付けが不要になり、処理が若干速くなります。
先読み・後読みアサーション(中級)
アサーションとは「マッチ結果には含まれないが、条件として指定するパターン」です。 先読み・後読みを使うと、「〜の前にある」「〜の後にある」という条件を付けられます。
| 記法 | 名称 | 意味 |
|---|---|---|
| (?=...) | 肯定先読み(lookahead) | 直後に指定パターンが続く場合にマッチ |
| (?!...) | 否定先読み | 直後に指定パターンが続かない場合にマッチ |
| (?<=...) | 肯定後読み(lookbehind) | 直前に指定パターンがある場合にマッチ |
| (?<!...) | 否定後読み | 直前に指定パターンがない場合にマッチ |
// 例: .pngで終わるURLのファイル名を取得(先読み) /\w+(?=\.png)/ // 例: 「円」の前にある数字を取り出す(後読み) // ¥マークの後の数字のみ取得(¥マーク自体はキャプチャしない) /(?<=¥)\d+/
注意: 後読みのブラウザ対応
後読みアサーション((?<=...))は JavaScriptではES2018(Chrome 62+、Safari 16.4+)から対応しています。 古いブラウザをサポートする場合は代替パターンを検討してください。
正規表現テスターで試してみる
正規表現の学習・デバッグにはぱんだツールズの正規表現テスターが便利です。パターンを入力するとリアルタイムでマッチ箇所がハイライトされ、 キャプチャグループの内容や置換後の文字列も即座に確認できます。
また、言語ごとの構文の違いを調べるには正規表現構文 横断検索で「JavaScript」「Python」「Go」など複数言語の書き方を並べて確認できます。
どちらもブラウザ内で完結するため、機密性の高いテキストやログを貼り付けても サーバーには送信されません。
まとめ — 正規表現を覚える順番
正規表現を効率よく習得するには、以下の順番がおすすめです。
- 基本メタ文字(. ^ $ [] \d \w \s)— まずここだけで多くのパターンが書けます
- 量指定子(* + ? {n,m})— 繰り返しの表現で一気に表現力が上がります
- グループと選択(() |)— 「このパターンのどれか」「取り出したい部分」に使います
- 貪欲・非貪欲マッチ(.* vs .*?)— HTMLパースなどで必須です
- アサーション((?=...) など)— 「〜の前後という条件」を文字を消費せずに指定できます
- 正規表現のパターンはエンジン(JavaScript・Python・PCRE等)ごとに方言があります
- 特殊文字(. * + ? ^ $ { } [] | () \)をそのままマッチさせるには \ でエスケープします
- パフォーマンスに注意:量指定子のネストはReDoSの原因になるので避けましょう
- 日本語文字には Unicode 範囲指定([ぁ-鿿])を使います
- パターンは正規表現テスターで試してから本番コードに組み込む習慣をつけると安全です