開発者のための正規表現チートシート
· 12分で読む
目次
正規表現の紹介
正規表現(regex)は、すべての開発者がマスターすべき強力なパターンマッチングツールです。冗長な文字列操作コードを書くことなく、テキストデータを検索、検証、操作するための簡潔で宣言的な方法を提供します。
フォーム検証の構築、ログファイルの解析、APIからのデータ抽出、データセットのクリーニングなど、正規表現はエレガントなソリューションを提供します。単一の正規表現パターンで数十行の条件ロジックを置き換えることができ、コードをより保守しやすく、エラーが発生しにくくします。
JavaScript、Python、Java、PHP、Rubyなどの最新のプログラミング言語には、すべて正規表現のサポートが組み込まれています。構文を学べば、事実上あらゆる開発環境でこれらのスキルを適用できます。
プロのヒント: 正規表現は最初は難解に見えるかもしれませんが、一貫したパターンに従っています。シンプルな表現から始めて、自信がついたら徐々に複雑さを増していきましょう。オンラインの正規表現テスターを使用して、リアルタイムでマッチを実験し視覚化しましょう。
基本的な構文と要素
複雑なパターンに取り組む前に、正規表現の基本的な構成要素を理解することが不可欠です。これらのコア要素は、あなたが書くすべての正規表現の基礎を形成します。
リテラル文字
最もシンプルな正規表現パターンは、表示されたとおりにリテラル文字と正確に一致します。パターンcatは、テキスト内のどこに出現しても文字列「cat」と一致します。
ほとんどの英数字はリテラルですが、特定の特殊文字(メタ文字と呼ばれる)は特別な意味を持ち、リテラルとして一致させたい場合はバックスラッシュでエスケープする必要があります。
必須のメタ文字
| パターン | 説明 | 例 | マッチ |
|---|---|---|---|
. |
改行以外の任意の1文字にマッチ | c.t |
「cat」、「cot」、「c9t」 |
^ |
文字列の先頭位置をアサート | ^Hello |
「Hello world」(先頭のみ) |
$ |
文字列の末尾位置をアサート | world$ |
「Hello world」(末尾のみ) |
* |
0回以上の繰り返しにマッチ | ab*c |
「ac」、「abc」、「abbc」 |
+ |
1回以上の繰り返しにマッチ | ab+c |
「abc」、「abbc」(「ac」ではない) |
? |
0回または1回の出現にマッチ | colou?r |
「color」、「colour」 |
| |
選択(OR演算子) | cat|dog |
「cat」または「dog」 |
\ |
特殊文字をエスケープ | \. |
リテラルのピリオド文字 |
特殊文字のエスケープ
メタ文字をリテラルとして一致させる必要がある場合は、バックスラッシュを前に付けます。たとえば、リテラルのピリオドと一致させるには、.だけでなく\.を使用します。
エスケープが必要な一般的な文字には次のものがあります:. * + ? ^ $ { } [ ] ( ) | \
// リテラルの疑問符にマッチ
const pattern = /What\?/;
pattern.test("What?"); // true
// ドル金額にマッチ
const price = /\$\d+\.\d{2}/;
price.test("$19.99"); // true
文字クラスと量指定子
文字クラスを使用すると、特定のセットから任意の文字と一致させることができ、量指定子はパターンが繰り返される回数を制御します。これらを組み合わせることで、柔軟なパターンマッチングの基盤が形成されます。
定義済み文字クラス
| クラス | 説明 | 同等 | 例 |
|---|---|---|---|
\d |
任意の数字 | [0-9] |
\d{3}は「123」にマッチ |
\D |
数字以外 | [^0-9] |
\D+は「abc」にマッチ |
\w |
単語文字(英数字+アンダースコア) | [A-Za-z0-9_] |
\w+は「user_123」にマッチ |
\W |
単語文字以外 | [^A-Za-z0-9_] |
\Wは「@」または「 」にマッチ |
\s |
空白文字(スペース、タブ、改行) | [ \t\n\r\f\v] |
\s+は「 」にマッチ |
\S |
空白文字以外 | [^ \t\n\r\f\v] |
\S+は「hello」にマッチ |
カスタム文字セット
角括弧はカスタム文字セットを定義します。パターン[aeiou]は任意の単一の母音と一致し、[0-9a-fA-F]は任意の16進数と一致します。
括弧内でキャレットを使用してセットを否定します:[^0-9]は数字ではない任意の文字と一致します。
// 任意の母音にマッチ
const vowels = /[aeiou]/gi;
"Hello World".match(vowels); // ["e", "o", "o"]
// 子音のみにマッチ
const consonants = /[^aeiou\s]/gi;
"Hello".match(consonants); // ["H", "l", "l"]
量指定子の詳細
量指定子は、前の要素が何回一致すべきかを指定します。デフォルトでは貪欲で、可能な限り多くのテキストと一致します。
{n}- 正確にn回:\d{4}は正確に4桁と一致{n,}- 少なくともn回:\d{3,}は3桁以上と一致{n,m}- nからm回の間:\d{2,4}は2、3、または4桁と一致*- 0回以上({0,}と同等)+- 1回以上({1,}と同等)?- 0回または1回({0,1}と同等)
クイックヒント: 任意の量指定子の後に疑問符を追加すると、非貪欲(怠惰)になります。たとえば、.*?は可能な限り多くの文字ではなく、可能な限り少ない文字と一致します。これは区切り文字間のコンテンツを抽出する際に重要です。
アンカーと単語境界
アンカーは文字と一致しません—文字列内の位置と一致します。テキストが特定の場所に表示されることを確認する必要がある場合、正確なパターンマッチングに不可欠です。
位置アンカー
キャレット^は文字列(または複数行モードでは行)の先頭と一致し、ドル記号$は末尾と一致します。これらは、文字列全体がパターンと一致する必要がある検証に非常に役立ちます。
// 文字列全体が数字であることを検証
const onlyDigits = /^\d+$/;
onlyDigits.test("12345"); // true
onlyDigits.test("123abc"); // false
// 「Error」で始まる行にマッチ
const errorLines = /^Error/gm;
const logs = "Info: Starting\nError: Failed\nError: Timeout";
logs.match(errorLines); // ["Error", "Error"]
単語境界
\bアンカーは単語境界—単語文字と非単語文字の間の位置と一致します。大きな単語の一部と誤って一致することなく、完全な単語と一致させるのに最適です。
\Bアンカーは単語境界ではない位置と一致します。
// 完全な単語としての「cat」のみにマッチ
const wholeCat = /\bcat\b/;
wholeCat.test("cat"); // true
wholeCat.test("cats"); // false
wholeCat.test("concatenate"); // false
// 単語内の「cat」にマッチ
const partialCat = /\Bcat\B/;
partialCat.test("concatenate"); // true
partialCat.test("cat"); // false
単語境界は、部分一致を避けたい検索と置換操作に特に役立ちます。また、構文ハイライターやコードアナライザーを構築する際にも不可欠です。
グループとキャプチャ
正規表現の括弧は複数の目的を果たします:パターンの一部をグループ化し、後で使用するために一致したテキストをキャプチャし、パターン自体内での後方参照を可能にします。
キャプチャグループ
括弧は、一致したテキストを保存する番号付きキャプチャグループを作成します。これらのキャプチャを置換文字列で参照したり、プログラムで抽出したりできます。
// 日付コンポーネントを抽出
const datePattern = /(\d{4})-(\d{2})-(\d{2})/;
const match = "2026-03-31".match(datePattern);
// match[0]: "2026-03-31" (完全一致)
// match[1]: "2026" (年)
// match[2]: "03" (月)
// match[3]: "31" (日)
// キャプチャを使用して日付を再フォーマット
const text = "Date: 2026-03-31";
const reformatted = text.replace(/(\d{4})-(\d{2})-(\d{2})/, "$2/$3/$1");
// 結果: "Date: 03/31/2026"
非キャプチャグループ
(?:...)を使用して、キャプチャを作成せずにパターンをグループ化します。これにより、選択や量指定子のためにグループ化のみが必要な場合、パフォーマンスが向上し、キャプチャ番号がクリーンに保たれます。
// キャプチャせずにグループ化
const protocol = /(?:https?|ftp):\/\//;
protocol.test("https://example.com"); // true
// キャプチャと比較(不要なオーバーヘッド)
const protocolCapture = /(https?|ftp):\/\//;
// 不要な追加のキャプチャグループを作成
名前付きキャプチャグループ
最新の正規表現エンジンは、(?<name>...)構文を使用した名前付きキャプチャをサポートしています。これにより、パターンが自己文書化され、保守しやすくなります。
// 明確性のための名前付きキャプチャ
const emailPattern = /(?<user>[\w.]+)@(?<domain>[\w.]+)/;
const match = "[email protected]".match(emailPattern);
console.log(match.groups.user); // "john.doe"
console.log(match.groups.domain); // "example.com"
// 置換で使用
const masked = "[email protected]".replace(
/(?<user>[\w.]+)@(?<domain>[\w.]+)/,
"***@$<domain>"
);
// 結果: "***@example.com"
後方参照
\1、\2などを使用して、同じパターン内の以前のキャプチャを参照します。これは、繰り返しまたはミラーパターンと一致させるのに強力です。
// 繰り返される単語にマッチ
const repeated = /\b(\w+)\s+\1\b/;
repeated.test("hello hello"); // true
repeated.test("hello world"); // false
// HTMLタグにマッチ
const htmlTag = /<(\w+)>.*?<\/\1>/;
htmlTag.test("<div>content</div>"); // true
htmlTag.test("<div>content</span>"); // false
正規表現フラグと修飾子
フラグは、正規表現エンジンがパターンを解釈する方法を変更します。ほとんどの言語では、閉じ区切り文字の後に追加されます(例:JavaScriptでは/pattern/flags)。
一般的なフラグ
- g(グローバル) - 最初の一致で停止する代わりに、すべての一致を見つける
- i(大文字小文字を区別しない) - 文字を一致させるときに大文字小文字を無視
- m(複数行) -
^と$を文字列境界ではなく行境界と一致させる - s(dotall) -
.を改行文字と一致させる - u(Unicode) - 完全なUnicodeサポートを有効にする
- y(sticky) - lastIndex位置からのみ一致
// 大文字小文字を区別しない検索
const pattern = /hello/i;
pattern.test("HELLO"); // true
pattern.test("Hello"); // true
// 複数の一致のためのグローバルフラグ
const digits = /\d+/g;
"Phone: 555-1234, Fax: 555-5678".match(digits);
// ["555", "1234", "555", "5678"]
// 複数行モード
const headers = /^#.+$/gm;
const markdown = "# Title\nContent\n## Subtitle";
markdown.match(headers); // ["# Title", "## Subtitle"]
プロのヒント: グローバルフラグは、exec()やtest()などのメソッドの動作を変更します—呼び出し間で状態を維持します。予期しない結果が得られる場合は、グローバルフラグが必要かどうか、またはステートフルマッチングで問題を引き起こしているかどうかを確認してください。
一般的なパターンとその応用
一般的な開発タスクのための実証済みの正規表現パターンを探りましょう。これらのパターンは実際の使用を通じて洗練されており、最初は考慮しないかもしれないエッジケースを処理します。
メール検証
RFC仕様のため、メール検証は非常に複雑ですが、この実用的なパターンは実際のメールアドレスの99%を処理します:
const emailPattern = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
// 有効なメール
emailPattern.test("[email protected]"); // true
emailPattern.test("[email protected]"); // true
// 無効なメール
emailPattern.test("invalid@"); // false
emailPattern.test("@example.com"); // false
emailPattern.test("[email protected]"); // false
本番アプリケーションでは、国際化ドメインとすべてのRFCエッジケースを処理する専用のメール検証ライブラリの使用を検討してください。また、メール検証ツールを使用して、メールパターンをインタラクティブにテストすることもできます。
URLマッチング
この包括的なパターンでテキストからURLを一致させて抽出します:
const urlPattern