正規表現の先読みアサーションを使う
先読み (?=...) と (?!...) は、現在位置に続く(または続かない)内容を、文字を消費せずにアサートします。幅ゼロのアサーションです。
- 1
先読み (lookahead) は、現在位置の後に続くパターンを、文字を消費せずにアサートします。肯定先読み (?=...) はパターンがマッチすることを要求し、否定先読み (?!...) はマッチしないことを要求します。先読みはゼロ幅であり、位置を進めません。パスワードの検証や条件付きマッチに有用です。
- 2 正規表現テスター →
先読みパターンをテストします。パスワード検証の例:(?=.*[A-Z])(?=.*[0-9]).{8,} は、大文字 1 文字以上、数字 1 文字以上、8 文字以上を要求します。先読みが同じ位置で条件を確認した後、.{8,} がパスワード全体にマッチします。
- 3 正規表現置換ツール →
置換で先読みを使います。\d(?=\d{3}) を , に置き換えると桁区切りを追加できます。1234567 → 1,234,567。先読みは後に 3 桁の数字が続くことを消費せずにアサートするため、置換が正しい位置ごとに適用されます。
よくある質問
- ゼロ幅アサーションとは何ですか?
- 文字を消費するのではなく、位置にマッチするパターンです。先読み (?=...)、単語境界 \b、先頭 ^、末尾 $ はゼロ幅です。マッチ位置を進めずに条件をアサートします。そのため、パスワードの要件のように、同じ位置で複数の条件を確認できます。
- 先読みにキャプチャグループを含められますか?
- はい。先読みの中のグループもキャプチャされ、後から参照できます。例えば (?=(\d+)) は数字を消費せずにキャプチャするため、重なり合うマッチが可能です。通常のマッチでは飛ばされてしまう、重なり合うパターンをすべて見つけるのに有用です。