ぱんだツールズぱんだツールズ

技術背景

正規表現入門 — 検索・置換・バリデーションに使うパターンの書き方

約8分

ログファイルから特定のエラー行だけ抽出したい、フォームのメールアドレスをバリデーションしたい—— そんなとき「正規表現で書けばいいのはわかるけど、パターンの意味がよく読めない」と詰まった経験はないでしょうか。 正規表現(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.cabc, a1c, a_c
^行の先頭^Hello行頭の "Hello"
$行の末尾end$行末の "end"
[abc]a・b・cのいずれか1文字[aeiou]母音1文字
[^abc]a・b・c以外の1文字[^0-9]数字以外の1文字
a|baまたは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*cac, abc, abbc, abbbc...
+1回以上ab+cabc, abbc(acはNG)
?0回または1回colou?rcolor, 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」など複数言語の書き方を並べて確認できます。

どちらもブラウザ内で完結するため、機密性の高いテキストやログを貼り付けても サーバーには送信されません。

まとめ — 正規表現を覚える順番

正規表現を効率よく習得するには、以下の順番がおすすめです。

  1. 基本メタ文字(. ^ $ [] \d \w \s)— まずここだけで多くのパターンが書けます
  2. 量指定子(* + ? {n,m})— 繰り返しの表現で一気に表現力が上がります
  3. グループと選択(() |)— 「このパターンのどれか」「取り出したい部分」に使います
  4. 貪欲・非貪欲マッチ(.* vs .*?)— HTMLパースなどで必須です
  5. アサーション((?=...) など)— 「〜の前後という条件」を文字を消費せずに指定できます
  • 正規表現のパターンはエンジン(JavaScript・Python・PCRE等)ごとに方言があります
  • 特殊文字(. * + ? ^ $ { } [] | () \)をそのままマッチさせるには \ でエスケープします
  • パフォーマンスに注意:量指定子のネストはReDoSの原因になるので避けましょう
  • 日本語文字には Unicode 範囲指定([ぁ-鿿])を使います
  • パターンは正規表現テスターで試してから本番コードに組み込む習慣をつけると安全です

よくある質問

正規表現はどの言語・ツールでも同じですか?

基本的なメタ文字(. * + ? ^ $ [] など)はほぼ共通ですが、方言(フレーバー)によって細部が異なります。たとえば後読みアサーション(lookbehind)はPCREやPython・JavaScriptのES2018以降で使えますが、古いJavaScriptエンジンやPOSIX正規表現では使えません。また \d(数字)や \w(単語文字)の定義もエンジンによって微妙に違います。ぱんだツールズの正規表現テスターはブラウザのJavaScriptエンジンを使っているので、Webフロントエンドの開発確認に最適です。

貪欲マッチと非貪欲マッチの違いは何ですか?

貪欲(greedy)マッチとは、量指定子(* + {n,m})ができる限り長くマッチしようとする動作です。たとえば <.*> は <a>text</a> に対して <a>text</a> 全体にマッチします。これを防ぐには <.*?> のように ? を付けて非貪欲(lazy)マッチにします。非貪欲マッチは最短の一致を優先するため、<a>text</a> に対して最初の <a> だけにマッチします。HTMLのパースに正規表現を使う場合は非貪欲マッチが必要になることが多いです。

日本語(ひらがな・カタカナ・漢字)にマッチするパターンは?

Unicode範囲指定を使います。ひらがなは [\u3041-\u3096]、カタカナは [\u30A1-\u30FA]、漢字(CJK統合漢字)は [\u4E00-\u9FFF] が基本です。まとめて「日本語文字全般」にマッチさせるには [\u3041-\u9FFF] が簡便ですが、記号類も一部含まれます。JavaScriptのES2018以降ではUnicodeプロパティエスケープ \p{Script=Hiragana} が使え、より正確に日本語文字を指定できます(u フラグが必要)。

メールアドレスのバリデーション正規表現を教えてください。

実用的に使えるパターンは /^[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}$/ です。これでほとんどのメールアドレスは検証できます。ただし完全にRFC 5321/5322に準拠した正規表現は非常に複雑になり、実用的ではありません。フロントエンドでの「入力ミス検出」程度であればこのパターンで十分で、最終的なバリデーションはサーバー側で行うのが一般的です。

エスケープが必要な特殊文字はどれですか?

正規表現で特殊な意味を持つ文字はエスケープ(前に \ を付ける)が必要です。対象は . * + ? ^ $ { } [ ] | ( ) \ の12文字です。たとえば「3.14」という文字列にマッチさせたいなら 3\.14 と書く必要があります(3.14 と書くと . が任意の1文字になる)。JavaScriptで動的に正規表現を生成する際は string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') でエスケープするのが定番です。

正規表現の処理が遅くなる・フリーズする原因は何ですか(ReDoS)?

ReDoS(Regular Expression Denial of Service)とは、特定のパターンと入力の組み合わせで正規表現エンジンが指数関数的に遅くなる現象です。(a+)+$ のような「量指定子のネスト」が典型的な原因です。たとえば "aaaaaaaaab" のような入力に対して、エンジンがバックトラッキング(マッチ失敗時の巻き戻し)を繰り返して固まります。対策は①量指定子をネストしない、②バックトラッキングが起きないアトミックグループ・所有格量指定子を使う(Javaなどで利用可)、③入力長を制限する、の3つです。

ぱんだツールズの正規表現テスターはどう使いますか?

ぱんだツールズの正規表現テスターでは、パターンを入力するとリアルタイムでマッチ箇所がハイライト表示されます。フラグ(g: 全件マッチ、i: 大文字小文字無視、m: 複数行モード)も切り替え可能です。マッチしたグループの内容や置換後の文字列も確認できます。すべてブラウザ内で処理されるため、機密性の高い文字列でも安心して入力できます。

JavaScriptとPythonで正規表現の書き方は違いますか?

基本構文は共通ですが、書き方に差があります。JavaScriptでは /パターン/フラグ のリテラル記法と new RegExp("パターン", "フラグ") の2種類があります。Pythonでは import re して re.compile(r"パターン") と書きます。Pythonの r"..." は生文字列(raw string)でバックスラッシュを1つで書けるため読みやすくなります。また名前付きキャプチャグループはJavaScriptが (?<name>...) 形式、Pythonが (?P<name>...) 形式と異なります。動作の細かい違いはぱんだツールズの正規表現構文 横断検索ツールで比較できます。

この記事で紹介したツール