正規表現パターンチートシート:一般的な表現の解説
· 12分で読めます
目次
正規表現(regex)は、開発者のツールキットの中で最も強力なツールの一つです。メールアドレスの検証、ログファイルの解析、テキストからのデータ抽出、複雑な検索置換操作の構築など、正規表現はテキストパターンを扱うための簡潔で柔軟な方法を提供します。
この包括的なガイドでは、基本的な構文から高度なテクニックまで、プロジェクトですぐに使える実用的な例とともにカバーしています。さまざまなプログラミング言語での正規表現を探求し、パフォーマンス最適化のヒントを共有し、経験豊富な開発者でもつまずく一般的なミスを避ける方法をお伝えします。
正規表現の基礎
その核心において、正規表現は検索パターンを定義する文字のシーケンスです。このパターンを文字列に対して実行すると、正規表現エンジンは指定したルールに従って一致を見つけようとします。
正規表現パターンは2種類の文字で構成されます:リテラル文字は自身と正確に一致し、メタ文字は特別な意味を持ちます。例えば、パターン/hello/は文字列内のどこでもリテラルテキスト「hello」に一致します。しかし/h.llo/はドットメタ文字を使用して「hello」、「hallo」、「hxllo」、または「h」で始まり「llo」で終わる他の5文字のシーケンスに一致します。
必須のメタ文字
日常的に使用する最も基本的な正規表現メタ文字のリファレンステーブルです:
| メタ文字 | 説明 | 例 | 一致するもの |
|---|---|---|---|
. |
任意の1文字(改行を除く) | c.t |
cat, cot, c9t, c@t |
\d |
任意の数字 [0-9] | \d{3} |
123, 456, 789 |
\D |
数字以外 | \D+ |
abc, XYZ, @#$ |
\w |
単語文字 [a-zA-Z0-9_] | \w+ |
hello, test_123 |
\W |
単語文字以外 | \W |
@, #, スペース, ! |
\s |
空白文字(スペース、タブ、改行) | \s+ |
1つまたは複数のスペース |
\S |
空白文字以外 | \S+ |
任意の可視文字 |
\b |
単語境界 | \bcat\b |
「cat」に一致するが「category」には一致しない |
^ |
文字列/行の先頭 | ^Hello |
「Hello」で始まる行 |
$ |
文字列/行の末尾 | end$ |
「end」で終わる行 |
プロのヒント: 正規表現テスターを使用して、これらのパターンをリアルタイムで試してみてください。独自のサンプルテキストに対してテストし、一致がすぐにハイライトされるのを確認できます。
特殊文字のエスケープ
リテラルメタ文字(ドットやアスタリスクなど)に一致させる必要がある場合は、バックスラッシュでエスケープする必要があります。例えば、\.はリテラルピリオドに一致し、\*はリテラルアスタリスクに一致します。
エスケープが必要な文字には次のものがあります: . * + ? ^ $ { } [ ] ( ) | \
文字クラスと量指定子
文字クラスを使用すると、一致させる文字のセットを定義でき、量指定子はパターンが何回繰り返されるべきかを指定します。これらは一緒になって、ほとんどの正規表現パターンのバックボーンを形成します。
文字クラス
角括弧は、括弧内の任意の1文字に一致する文字クラスを作成します:
| パターン | 説明 | 一致例 |
|---|---|---|
[abc] |
a、b、またはcに一致 | a, b, c (1文字) |
[^abc] |
a、b、c以外に一致 | d, e, 1, @など |
[a-z] |
任意の小文字に一致 | aからz |
[A-Z] |
任意の大文字に一致 | AからZ |
[0-9] |
任意の数字に一致 | 0から9 (\dと同じ) |
[a-zA-Z] |
任意の文字に一致 | すべての文字、大文字小文字問わず |
[a-zA-Z0-9] |
任意の英数字に一致 | 文字と数字 |
[a-z&&[^aeiou]] |
子音のみ(積集合) | b, c, d, f, gなど |
量指定子
量指定子は、前の要素が何回一致すべきかを指定します。これらは可変長のパターンに一致させるために不可欠です:
*— 0回以上(貪欲)+— 1回以上(貪欲)?— 0回または1回(オプション){3}— 正確に3回{3,}— 3回以上{3,6}— 3回から6回の間*?— 0回以上(怠惰/非貪欲)+?— 1回以上(怠惰/非貪欲)??— 0回または1回(怠惰)
貪欲マッチと怠惰マッチ
貪欲量指定子と怠惰量指定子の違いを理解することは、効率的な正規表現パターンを書くために重要です。デフォルトでは、量指定子は貪欲です — パターン全体が一致できる範囲で、できるだけ多くのテキストに一致します。
文字列"<div>content</div><div>more</div>"での例を考えてみましょう:
- 貪欲:
<div>.*</div>は最初の<div>から最後の</div>まで文字列全体に一致します - 怠惰:
<div>.*?</div>は各<div>...</div>ペアに個別に一致します
怠惰バージョンは量指定子の後に?を追加し、パターンを満たしながらできるだけ少なく一致するよう正規表現エンジンに指示します。
クイックヒント: HTMLやXMLを解析する際は、複数のタグにまたがって一致しないよう、常に怠惰量指定子を使用してください。さらに良いのは、複雑なマークアップには正規表現の代わりに適切なパーサーライブラリを使用することです。
一般的な正規表現パターン
一般的な検証と抽出タスクのための実戦テスト済みの正規表現パターンです。これらのパターンは世界中の本番アプリケーションで使用されています。
メール検証
ほとんどの実際のケースをカバーする実用的なメール検証パターン:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
このパターンは、メールにローカル部分(@の前)、ドメイン名、有効なトップレベルドメインがあることを保証します。正規表現だけで完璧なメール検証は不可能であることに注意してください — 公式のRFC 5322標準は非常に複雑です。本番環境では、専用のメール検証ライブラリの使用を検討してください。
電話番号
オプションの国コードとさまざまな形式の米国電話番号:
^(\+1[-.\s]?)?(\(?\d{3}\)?[-.\s]?)?\d{3}[-.\s]?\d{4}$
次のような形式に一致します:
- 555-123-4567
- (555) 123-4567
- +1 555 123 4567
- 5551234567
URL
オプションのwwwプレフィックス付きHTTPおよびHTTPS URLに一致:
^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)$
IPアドレス
IPv4アドレスの検証:
^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
これは各オクテットが0から255の間であることを保証します。
日付
ISO 8601日付形式(YYYY-MM-DD):
^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$
米国日付形式(MM/DD/YYYY):
^(0[1-9]|1[0-2])\/(0[1-9]|[12][0-9]|3[01])\/\d{4}$
クレジットカード番号
基本的なクレジットカード検証(スペースとダッシュを削除):
^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13}|6(?:011|5[0-9]{2})[0-9]{12})$
このパターンはVisa、MasterCard、American Express、Discoverカードを検証します。実際の検証には常にLuhnアルゴリズムを使用してください。
パスワード
少なくとも8文字、大文字1つ、小文字1つ、数字1つ、特殊文字1つを必要とする強力なパスワード:
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$
これは先読みアサーション(次のセクションでカバー)を使用して、すべての要件が満たされていることを保証します。
プロのヒント: 正規表現テスターでこれらのパターンをテストし、お気に入りを保存してすぐにアクセスできるようにしましょう。また、コードフォーマッターを使用して、ソースコード内の正規表現パターンをクリーンアップすることもできます。
アンカー、グループ、先読み
これらの高度な機能により、一致が発生する場所とパターンがキャプチャされる方法を正確に制御できます。
アンカー
アンカーは文字に一致しません — 文字列内の位置に一致します:
^— 文字列の先頭(または複数行モードでの行)$— 文字列の末尾(または複数行モードでの行)\b— 単語境界(\wと\Wの間)\B— 非単語境界\A— 文字列の先頭(複数行モードでも常に)\Z— 文字列の末尾(複数行モードでも常に)
例: \bcat\bは「cat」を完全な単語として一致させますが、「category」や「concatenate」の「cat」には一致しません。
キャプチャグループ
括弧は一致した部分文字列を抽出するキャプチャグループを作成します:
^(\d{3})-(\d{3})-(\d{4})$
このパターンは電話番号に一致し、市外局番、プレフィックス、回線番号を個別にキャプチャします。これらのキャプチャを置換文字列で参照したり、プログラムで抽出したりできます。
非キャプチャグループ
グループ化が必要だが一致をキャプチャしたくない場合は(?:...)を使用します:
(?:https?|ftp)://[^\s]+
これはhttp、https、またはftpで始まるURLに一致しますが、プロトコルのキャプチャグループは作成しません。
名前付きキャプチャグループ
名前付きグループは正規表現をより読みやすく保守しやすくします:
(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})
番号ではなく名前でこれらを参照できるため、コードがより明確になります。
先読みアサーション
先読みは、文字を消費せずにパターンが先に存在するかどうかをチェックします:
(?=...)— 肯定先読み(後に続く必要がある)(?!...)— 否定先読み(後に続いてはいけない)
例: \d+(?= dollars)は「 dollars」が後に続く数字に一致しますが、「 dollars」は一致に含まれません。
後読みアサーション
後読みは現在の位置の前に何があるかをチェックします:
(?<=...)— 肯定後読み(前に必要)(?<!...)— 否定後読み(前にあってはいけない)
例: (?<=\$)\d+はドル記号が前にある数字に一致しますが、$は一致に含まれません。
JavaScriptはES2018で後読みサポートを獲得したばかりなので、古いブラウザをサポートしている場合は互換性を確認してください。
JavaScriptでの正規表現
JavaScriptはRegExpオブジェクトと文字列メソッドを通じて堅牢な正規表現サポートを提供します。JavaScriptアプリケーションで正規表現を効果的に使用する方法は次のとおりです。
正規表現パターンの作成
正規表現パターンは2つの方法で作成できます:
// リテラル表記(静的パターンに推奨)
const pattern1 = /\d{3}-\d{3}-\d{4}/;
// コンストラクタ(動的パターンに便利)
const pattern2 = new RegExp('\\d{3}-\\d{3}-\\d{4}');
コンストラクタでの二重バックスラッシュに注意してください — 文字列内でバックスラッシュをエスケープする必要があります。
正規表現フラグ
JavaScriptは正規表現の動作を変更するいくつかのフラグをサポートしています: