正規表現とは?完全な解説
簡単な回答
正規表現は、文字列のセットを記述するパターンです。リテラル文字 (それ自体と一致する) と特別な意味を持つメタ文字 (*、+、?、.、^、$、[]、()、{}、|、\) を使用します。正規表現は、検証、検索、抽出、置換に使用されます。無料の Regex Tester を使用して、ブラウザ内のテキストに対してパターンをテストします。
導入
正規表現 (regex または regexp) は、検索パターンを定義する一連の文字です。このパターンは、文字列検索アルゴリズムによってテキストの検索、一致、または置換に使用されます。正規表現は、1950 年代に形式言語理論 (Stephen Kleene) で誕生し、1970 年代に Unix テキスト ツール (grep、sed、awk) に採用されました。現在、正規表現は事実上すべてのプログラミング言語とテキスト エディターに組み込まれています。 Regex は強力で、電子メール形式を検証し、ログからデータを抽出し、複雑なパターンを見つけることができます。しかし、構文が緻密で読みにくいことで知られています。
ステップバイステップ
-
リテラル文字とメタ文字を理解する
リテラル文字 (a、b、1、@) はそれ自体と一致します。メタキャラクターには特別な意味があります: 。任意の文字に一致します。* は 0 個以上を意味し、+ は 1 つ以上を意味します。 0 または 1 を意味し、^ は開始に一致し、$ は終了に一致します。
-
キャラクタークラスを学ぶ
角括弧 [] は文字クラスを定義します。[aeiou] は任意の母音に一致し、[0-9] は任意の数字に一致し、[^0-9] は任意の非数字に一致します。短縮クラス: \d (数字)、\w (単語文字)、\s (空白)、およびそれらの大文字の否定。
-
数量指定子を使用する
量指定子は、パターンが繰り返される回数を指定します: * (0+)、+ (1+)、? (0 または 1)、{n} (正確に n)、{n,} (n+)、{n,m} (n から m)。デフォルトでは貪欲です。追加 ?遅延マッチングの場合 (例: *?)。
-
グループとアンカー
括弧 () はキャプチャ グループを作成します。代替 |どちらかの側 (cat|dog) に一致します。アンカー ^ と $ は文字列の先頭と末尾に一致します。これらを使用して、単純なパターンから複雑なパターンを構築します。
例
電子メールのようなパターンに一致する
入力: Pattern: [a-z]+@[a-z]+\.[a-z]+
出力: 一致: alice@example.com、bob@test.org
電話番号の形式を一致させる
入力: Pattern: \d{3}-\d{3}-\d{4}
出力: Matches: 555-123-4567
キーと値のペアを抽出する
入力: Pattern: (\w+)=(\w+)
出力: Matches 'key=value' with group 1 as key, group 2 as value
よくある問題
- 貪欲なマッチングは、可能な限り —.* のマッチングを過剰に消費します。使用 。*?遅延マッチングでは、最短の一致を見つけます。
- 特殊文字のエスケープを忘れる — .、*、+、? などは特殊です。文字通りに一致させるには \ を使用します (例: \. はリテラルのドットに一致します)。
- 壊滅的なバックトラッキング — ネストされた量指定子を含むパターン (例: (a+)+) は、特定の入力で指数関数的な時間がかかり、ReDoS 攻撃を引き起こす可能性があります。
- オーバーマッチング - アンカー (^ と $) を使用しない場合、パターンはどこにでも一致します。文字列全体と一致するには、^...$ を使用します。
ヒント
- シンプルに始めて、段階的に複雑さを加えていきます。複雑な正規表現を一度にデバッグするのは非常に困難です。
- 正規表現テスターを使用して、サンプル テキストに対するパターンを実験します。リアルタイムで一致がハイライト表示されます。
- 拡張モード (一部のエンジンでは /x フラグ) を使用して複雑な正規表現をコメント化するか、名前付き部分に分割します。
- Regex Tester を使用すると、ブラウザで即座にパターンをテストできます。サインアップは不要で、完全にプライベートです。