正規表現チートシート:一般的なパターンとクイックリファレンス

· 12分で読めます

目次

正規表現は開発者のツールキットの中で最も強力なツールの1つですが、多くのプログラマーにとって依然として威圧的なものです。この包括的なチートシートは、正規表現パターンをすぐに使える実用的な例とともに、理解しやすいセクションに分解しています。

メールアドレスの検証、ログファイルの解析、乱雑なデータのクリーンアップなど、このガイドはより良い正規表現パターンをより速く書くのに役立ちます。基本的な文字マッチングから高度な先読みアサーションまで、すべてをカバーします。

正規表現の基礎

正規表現(regexまたはregexp)は、文字列内の文字の組み合わせにマッチするために使用されるパターンです。JavaScript、Python、Java、PHP、Ruby、Goなど、事実上すべてのプログラミング言語、およびVS Code、Sublime Textなどのテキストエディタ、grepやsedなどのコマンドラインツールでサポートされています。

その核心において、正規表現パターンは2種類の文字で構成されています:正確に自分自身にマッチするリテラル文字と、特別な意味を持ちマッチングルールを定義するメタ文字です。

最も単純な正規表現はリテラル文字列です。パターンhelloは、出現する場所でテキスト「hello」に正確にマッチします。しかし、真の力は、任意の数字にマッチしたり、パターンを繰り返したり、特定の位置に固定したりするなど、柔軟性を追加するメタ文字から来ています。

プロのヒント:私たちの正規表現テスターを使用して、リアルタイムでパターンを試してみてください。入力すると即座にマッチがハイライトされるので、パターンがどのように機能するかを理解するのがはるかに簡単になります。

リテラル文字とメタ文字

正規表現パターンのほとんどの文字はリテラルです—それらは自分自身にマッチします。パターンcatは、その正確な順序で文字c、a、tにマッチします。ただし、特定の文字には特別な意味があります:

例えば、example\.comは「example.com」に文字通りマッチしますが、example.comは「exampleXcom」にマッチします。なぜなら、エスケープされていないドットは任意の文字にマッチするからです。

文字クラス

文字クラスを使用すると、可能性のあるセットから1つの文字にマッチさせることができます。これらは柔軟なパターンマッチングの基礎であり、2つの形式があります:事前定義された短縮クラスとカスタムブラケット式です。

パターン マッチ
. 改行以外の任意の文字 h.t → hat、hot、hit、h@t
\d 任意の数字 [0-9] \d{3} → 123、456、789
\D 任意の非数字 \D+ → abc、xyz、@#$
\w 単語文字 [a-zA-Z0-9_] \w+ → hello_world、var123
\W 非単語文字 \W → @、#、スペース、句読点
\s 空白文字(スペース、タブ、改行) \s+ → 任意の空白シーケンス
\S 非空白文字 \S+ → 任意の可視文字
[abc] a、b、またはcのいずれか [aeiou] → 任意の母音
[^abc] a、b、c以外 [^0-9] → 任意の非数字
[a-z] 範囲:aからz [A-Za-z] → 任意の文字
[a-z0-9] 複数の範囲 [a-fA-F0-9] → 16進数字

カスタム文字クラス

ブラケット式[]を使用すると、独自の文字セットを定義できます。ブラケット内では、ほとんどのメタ文字は特別な意味を失います—エスケープする必要はありません。

クイックヒント:文字クラス内の文字の順序は重要ではありません。[abc][bca]は同一です。クラスは、文字のいずれかが存在する場合にマッチします。

実用的な例

文字クラスの実際の使用例をいくつか示します:

量指定子と繰り返し

量指定子は、パターンが何回繰り返されるべきかを指定します。これらは、繰り返したい要素(文字、文字クラス、またはグループ)の後に配置されます。

量指定子 意味
* 0回以上 ab*c → ac、abc、abbc、abbbc
+ 1回以上 ab+c → abc、abbc(acではない)
? 0回または1回(オプション) colou?r → color、colour
{n} 正確にn回 \d{4} → 2026、1999
{n,} n回以上 \w{3,} → 3文字以上の単語
{n,m} n回からm回の間 \d{2,4} → 12、123、1234
*? 最小マッチ(0回以上) <.*?> → 最初のタグのみ
+? 最小マッチ(1回以上) ".+?" → 最初の引用文字列
?? 最小マッチ(0回または1回) \d?? → 可能であれば0桁にマッチ

貪欲マッチと最小マッチ

これは正規表現で最も重要な概念の1つです。デフォルトでは、量指定子は貪欲です—全体のパターンがマッチすることを許可しながら、できるだけ多くのテキストにマッチします。

HTML文字列<b>bold</b> and <i>italic</i>を考えてみましょう:

量指定子の後に?を追加すると、最小(非貪欲または最小とも呼ばれます)になります。パターンが成功することを許可しながら、できるだけ少ないテキストにマッチします。

プロのヒント:区切り文字(引用符、タグ、ブラケット)間のコンテンツを抽出する場合、ほぼ常に最小量指定子を使用してください。パターン".*?"は個々の引用文字列を正しく抽出しますが、".*"はテキスト全体の最初の引用符から最後の引用符までマッチします。

一般的な量指定子パターン

常に使用するパターンは次のとおりです:

アンカーと境界

アンカーは文字にマッチしません—文字列内の位置にマッチします。これらは、パターンがテキスト内のどこでもではなく、特定の場所でマッチすることを保証するために不可欠です。

アンカー 位置
^ 文字列の先頭(mフラグで行) ^Hello → 「Hello world」にマッチするが「Say Hello」にはマッチしない
$ 文字列の末尾(mフラグで行) end$ → 「The end」にマッチするが「end of story」にはマッチしない
\b 単語境界 \bcat\b → 「cat」にマッチするが「category」にはマッチしない
\B 非単語境界 \Bcat\B → 「concatenate」にマッチするが「cat」にはマッチしない
\A 文字列の先頭(決して行ではない) ^に似ているが複数行モードを無視する
\Z 文字列の末尾(決して行ではない) $に似ているが複数行モードを無視する

単語境界の説明

単語境界\bは非常に便利ですが、しばしば誤解されています。これは、単語文字(\w)と非単語文字(\W)の間の位置、または文字列の先頭/末尾にマッチします。

異なる文字列に適用されたパターン\bcat\bを考えてみましょう:

これにより、\bは、より大きな単語の一部に誤ってマッチすることなく、完全な単語を見つけるのに最適です。

先頭と末尾のアンカー

^$アンカーは検証に不可欠です。文字列全体がパターンにマッチすることを確認したい場合(単に含まれているだけでなく)、パターンをこれらのアンカーで囲みます。

クイックヒント:ユーザー入力(メール、電話、ユーザー名)を検証する場合、常に^$を使用してパターンを固定してください。これらがないと、パターン\d{3}は「abc123def」を受け入れますが、おそらく正確に3桁以外のものを拒否したいでしょう。

グループとキャプチャ

括弧()は正規表現で2つの目的を果たします:パターンの一部をグループ化し、後で使用するためにマッチしたテキストをキャプチャします。これは、正規表現が抽出と変換のために真に強力になる場所です。

構文 目的
(abc) キャプチャグループ (\d{3})-(\d{4})は市外局番と番号をキャプチャ
(?:abc) 非キャプチャグループ (?:https?://)?example\.comはキャプチャせずにグループ化
(a|b) 選択(OR) (cat|dog)は「cat」または「dog」のいずれかにマッチ
\1 グループ1への後方参照 (\w+)\s+\1は「the the」のような繰り返し単語にマッチ
(?<name>abc) 名前付きキャプチャグループ (?<year>\d{4})-(?<month>\d{2})は日付用

キャプチャグループ

パターンの一部を括弧で囲むと、正規表現エンジンはマッチしたテキストをキャプチャします。その後、コード内で、または後方参照を使用して正規表現自体内でこれらのキャプチャを参照できます。

例えば、「555-123-4567」に適用されたパターン(\d{3})-(\d{3})-(\d{4})は3つのキャプチャを作成します:

ほとんどのプログラミング言語では、マッチオブジェクトまたは置換文字列を通じてこれらのキャプチャにアクセスできます。これにより、データを簡単に再フォーマットできます—「555-123-4567」を($1) $2-$3のような置換で「(555) 123-4567」に変換できます。

非キャプチャグループ

量指定子や選択のためにグループ化が必要だが、テキストをキャプチャする必要がない場合があります。(?:...