正規表現チュートリアル: 初心者向けRegexガイド
· 12分で読める
目次
正規表現とは何か、なぜ学ぶべきか?
正規表現(一般的にregexまたはregexpと略される)は、特殊な構文を使用してテキストを検索、検証、抽出、操作できる強力なパターンマッチングツールです。単純な「検索と置換」操作をはるかに超える高度な検索言語と考えてください。
数千行のログデータを含むファイルからすべてのメールアドレスを抽出する必要がある場合や、ユーザーの電話番号が正しい形式に従っているかを検証する必要がある場合を想像してください。従来の文字列操作メソッドを使用すると、冗長で保守が困難なコードになります。正規表現は、これらのタスクを単一の簡潔なパターンで実現できます。
正規表現の核心は、リテラル文字と特殊なメタ文字の組み合わせを使用して検索パターンを定義することです。これらのパターンは、「cat」のような単純な文字列や、メールアドレス、URL、クレジットカード番号のような複雑な構造にマッチできます。
なぜ正規表現を学ぶべきか?
- テキスト処理の効率性: 正規表現は大量のテキストデータを迅速に処理し、従来のコードでは数十行必要な複雑な検索と置換操作を実行できます
- データ検証: ユーザー入力(メール、電話番号、パスワード強度)の検証はWeb開発における一般的な要件であり、正規表現はエレガントなソリューションを提供します
- データ抽出: 非構造化テキストから構造化情報を抽出します。例えば、Webページからリンクを抽出したり、ログからエラーメッセージを抽出したりします
- クロスプラットフォームの普遍性: ほぼすべてのプログラミング言語とテキストエディタが類似の構文で正規表現をサポートしています
- 生産性の向上: 正規表現をマスターすることで、反復的なコードの記述や手動のテキスト操作に費やす時間を劇的に削減できます
- コードリファクタリング: リファクタリングプロジェクト中にコードベース全体でパターンを迅速に検索および変更できます
実世界での応用
正規表現はソフトウェア開発とデータ処理全体で広く使用されています:
- Webフォーム検証: メール、電話番号、郵便番号、その他のユーザー入力が期待される形式に一致することを確認します
- ログ解析: サーバーログを解析してエラーメッセージ、IPアドレス、タイムスタンプ、その他の関連データを抽出します
- テキストエディタ操作: VS Code、Sublime Text、VimなどのIDEでの高度な検索と置換
- Webスクレイピング: Webクローラーを構築する際にHTMLコンテンツから特定のデータパターンを抽出します
- 設定ファイルの解析: 特定の構文要件を持つ設定ファイルを読み取り、検証します
- データクリーニング: 分析前にデータセット内の一貫性のないデータ形式を標準化します
- セキュリティ: インジェクション攻撃を防ぐためにユーザー入力内の悪意のあるパターンを検出します
プロのヒント: 正規表現は強力ですが、すべての仕事に最適なツールとは限りません。HTMLやJSONのような複雑な構造化データを解析する場合は、専用のパーサーを使用してください。正規表現はプレーンテキストでのパターンマッチングに最適です。
基本構文と基礎
正規表現は2種類の文字で構成されています: リテラル文字(それ自体にマッチする)とメタ文字(特別な意味を持つ)。基礎から始めましょう。
リテラル文字
最も単純な正規表現は単なるプレーンテキストです。パターンcatはテキスト内の正確な文字列「cat」にマッチします。
テキスト: "The cat sat on the mat"
正規表現: cat
マッチ: "The cat sat on the mat"
リテラル文字はデフォルトで大文字小文字を区別するため、catは大文字小文字を区別しないフラグを使用しない限り「Cat」や「CAT」にマッチしません。
ドットメタ文字(.)
ドット.は改行文字を除く任意の1文字にマッチするワイルドカードです。
テキスト: "cat", "cot", "cut", "c@t"
正規表現: c.t
マッチ: 4つすべての文字列
リテラルのドット文字にマッチさせるには、バックスラッシュでエスケープします: \.
テキスト: "file.txt"
正規表現: file\.txt
マッチ: "file.txt" ("fileAtxt"ではない)
アンカー: 位置のマッチング
アンカーは文字にマッチしません—テキスト内の位置にマッチします。
キャレット(^) - 行の先頭: ^アンカーは文字列または行の先頭にマッチします。
テキスト: "cat\ndog\ncat"
正規表現: ^cat
マッチ: 最初の「cat」のみ
ドル記号($) - 行の末尾: $アンカーは文字列または行の末尾にマッチします。
テキスト: "cat\ndog\ncat"
正規表現: cat$
マッチ: 最後の「cat」のみ
アンカーの組み合わせ: 両方を使用して行全体にマッチさせます。
正規表現: ^cat$
マッチ: 前後に何もない正確に「cat」のみを含む行
単語境界(\b)
\bアンカーは単語境界—単語文字と非単語文字の間の位置にマッチします。
テキスト: "cat category caterpillar"
正規表現: \bcat\b
マッチ: 独立した単語「cat」のみ
これは部分的な単語にマッチさせずに完全な単語を見つけるのに非常に便利です。
エスケープシーケンス
正規表現の特殊文字をリテラルにマッチさせるには、バックスラッシュでエスケープする必要があります:
| 特殊文字 | エスケープ形式 |
|---|---|
| . * + ? ^ $ { } [ ] ( ) | \ | \. \* \+ \? \^ \$ \{ \} \[ \] \( \) \| \\ |
価格にマッチする例:
正規表現: \$\d+\.\d{2}
マッチ: "$19.99", "$5.00"
文字クラスと範囲
文字クラスを使用すると、文字のセットを定義し、そのいずれか1つにマッチさせることができます。角括弧で囲まれます。
基本的な文字クラス
角括弧[]は、内部の任意の1文字にマッチする文字セットを作成します。
テキスト: "cat", "cot", "cut", "cit"
正規表現: c[aou]t
マッチ: "cat", "cot", "cut" ("cit"ではない)
文字範囲
ハイフンを使用して文字の範囲を定義します:
[a-z]- 任意の小文字[A-Z]- 任意の大文字[0-9]- 任意の数字[a-zA-Z]- 任意の文字(大文字または小文字)[a-z0-9]- 任意の文字または数字
テキスト: "a1", "b2", "c3", "d4"
正規表現: [a-c][1-3]
マッチ: "a1", "b2", "c3" ("d4"ではない)
否定文字クラス
文字クラスの先頭でキャレット^を使用して否定します—セット内にない任意の文字にマッチします。
正規表現: [^0-9]
マッチ: 数字ではない任意の文字
テキスト: "abc123def"
正規表現: [^a-z]+
マッチ: "123" (小文字ではない文字のシーケンス)
定義済み文字クラス
正規表現は一般的な文字クラスの省略形を提供します:
| 省略形 | 同等 | 説明 |
|---|---|---|
\d |
[0-9] |
任意の数字 |
\D |
[^0-9] |
任意の非数字 |
\w |
[a-zA-Z0-9_] |
任意の単語文字 |
\W |
[^a-zA-Z0-9_] |
任意の非単語文字 |
\s |
[ \t\n\r\f\v] |
任意の空白文字 |
\S |
[^ \t\n\r\f\v] |
任意の非空白文字 |
単純な電話番号にマッチする例:
正規表現: \d{3}-\d{3}-\d{4}
マッチ: "555-123-4567"
クイックヒント: 省略形クラスの大文字バージョンは常に小文字の対応するものの否定です。\dは数字にマッチし、\Dは非数字にマッチします。
量指定子: マッチの繰り返しを制御する
量指定子は、文字またはグループが何回マッチすべきかを指定します。繰り返したい要素の後に配置されます。
基本的な量指定子
*- 0回以上+- 1回以上?- 0回または1回(オプションにする){n}- 正確にn回{n,}- 少なくともn回{n,m}- n回からm回の間
量指定子の実例
アスタリスク(*) - 0回以上:
正規表現: ca*t
マッチ: "ct", "cat", "caat", "caaat"
プラス(+) - 1回以上:
正規表現: ca+t
マッチ: "cat", "caat", "caaat" ("ct"ではない)
疑問符(?) - オプション:
正規表現: colou?r
マッチ: "color"と"colour"
正確な回数{n}:
正規表現: \d{3}
マッチ: "123"のような正確に3桁の数字
範囲{n,m}:
正規表現: \d{2,4}
マッチ: "12"、"123"、または"1234"のような2〜4桁の数字
貪欲vs最小マッチ量指定子
デフォルトでは、量指定子は貪欲です—できるだけ多くのテキストにマッチします。量指定子の後に?を追加すると最小マッチになります(できるだけ少なくマッチ)。
テキスト: "<div>content</div><div>more</div>"
正規表現(貪欲): <div>.*</div>
マッチ: "<div>content</div><div>more</div>" (文字列全体)
正規表現(最小): <div>.*?</div>
マッチ: "<div>content</div>" (最初のタグのみ)
最小マッチ量指定子:
*?- 0回以上(最小)+?- 1回以上(最小)??- 0回または1回(最小){n,m}?- n回からm回の間(最小)
プロのヒント: 貪欲マッチは大きなテキストでパフォーマンスの問題を引き起こす可能性があります。特にネストされた構造を扱う場合、可能な限り短い文字列にマッチさせる必要があるときは最小マッチ量指定子を使用してください。
実用例: HTMLタグのマッチング
正規表現: <([a-z]+)>.*?</\1>
マッチ: "<p>text</p>"や"<div>content</div>"のようなペアのHTMLタグ
このパターンは、複数のタグを一度にキャプチャしないように最小マッチを使用し、後方参照(次にカバー)を使用して開始タグと終了タグが一致することを確認します。
グループとキャプチャ
括弧()は複数の目的を果たすグループを作成します: パターンの一部をグループ化し、後で使用するためにマッチしたテキストをキャプチャし、後方参照を可能にします。
基本的なグループ化
グループを使用すると、複数の文字に量指定子を適用できます:
正規表現: (ha)+
マッチ: "ha", "haha", "hahaha"
グループ化なしでは、ha+は「ha」、「haa」、「haaa」にマッチします('a'のみが繰り返される)。
キャプチャグループ
グループは自動的にマッチしたテキストをキャプチャし、後で参照できます:
テキスト: "John Smith"
正規表現: (\w+) (\w+)
キャプチャ: グループ1 = "John", グループ2 = "Smith"
ほとんどのプログラミング言語では、これらのキャプチャにアクセスできます:
// JavaScriptの例
const match = "John Smith".match(/(\w+) (\w+)/);
console.log(match[1]); // "John"
console.log(match[2]); // "Smith"
後方参照
後方参照を使用すると、パターンの前の部分でグループによってキャプチャされたのと同じテキストにマッチできます。\1、\2などを使用します。
正規表現: (\w+) \1
マッチ: "the the"や"is is"のような繰り返される単語
正規表現: <([a-z]+)>.*?</\1>
マッチ: "<div>...</div>"のようなマッチするHTMLタグ
非キャプチャグループ
キャプチャなしでグループ化が必要な場合があります。非キャプチャグループには(?:...)を使用します:
正規表現: (?:https?|ftp)://\S+
マッチ: http、https、またはftpで始まるURL
(プロトコルはグループとしてキャプチャされない)
非キャプチャグループは、キャプチャされたテキストを参照する必要がない場合にパフォーマンスを向上させます。
名前付きキャプチャグループ
名前付きグループは正規表現をより読みやすく保守しやすくします:
正規表現: (?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})
マッチ: "2026-03-31"のような日付
アクセス: match.groups.year, match.groups.month, match.groups.day
名前付きグループは、番号付き参照が混乱する複雑なパターンで特に便利です。
クイックヒント: 複雑なパターンには名前付きグループを使用してください