正規表現で「特定のパターンを含まない文字列」を検索したい場面があります。
「〇〇以外にマッチさせるには?」「否定先読みってどう使うの?」という疑問をお持ちの方に向けて、この記事では正規表現の否定パターンの書き方と使い方をわかりやすく解説していきます。
正規表現の否定は文字クラスの否定・否定先読み・否定後読みの3つの方法で実現できる
それではまず、正規表現における否定パターンの全体像について解説していきます。
正規表現で否定を表現する方法は主に「文字クラスの否定([^…])」「否定先読み((?!…))」「否定後読み((?の3種類があります。
それぞれ否定の対象と使い方が異なるため、目的に応じて適切な方法を選ぶことが重要です。
正規表現の否定パターンを使いこなすことで、「特定の文字を含まない行の検索」「特定の接頭辞を持たない単語の抽出」「特定のパターンに続かない文字列の検索」など、肯定のマッチングだけでは実現できない複雑な検索が可能になります。
文字クラスの否定([^…])
続いては、最もシンプルな否定表現である文字クラスの否定について確認していきます。
文字クラス否定の基本
「[^…]」は角括弧内の文字セットに含まれない1文字にマッチする否定文字クラスです。
文字クラス否定の使用例
[^0-9] :数字以外の文字1文字にマッチ
[^aeiou] :母音以外の文字1文字にマッチ
[^a-zA-Z] :英字以外の文字1文字にマッチ
[^\n] :改行以外の文字1文字にマッチ(デフォルトの「.」と同義)
文字クラス否定の注意点
「[^…]」は1文字単位の否定であるため、「特定の文字列を含まない」という複数文字の否定には使えません。
複数文字のパターンを含まないマッチングには否定先読みが必要です。
否定先読み((?!…))
続いては、より高度な否定パターンである否定先読みについて確認していきます。
否定先読みの基本
否定先読み「(?!パターン)」は現在の位置の直後に指定パターンが続かない場合にマッチするゼロ幅アサーションです。
ゼロ幅とはマッチした際に文字を消費しない(カーソルが進まない)という意味であり、「位置」のみを検査します。
否定先読みの使用例
\d+(?!\.\d) :小数点に続かない整数にマッチ(例:「123」にはマッチ、「123.45」の123にはマッチしない)
color(?!s) :「colors」の「color」にはマッチしない「color」にマッチ
(?!.*error).*\n :「error」を含まない行にマッチ(行全体の否定)
行全体の否定マッチング
特定のパターンを含まない行全体を検索したい場合は「^(?!.*除外パターン).*$」という形式が有効です。
multilineフラグと組み合わせることで、複数行テキストから条件を満たす行のみを抽出できます。
否定後読み((?
続いては、否定先読みと対になる概念である否定後読みについて確認していきます。
否定後読みの基本
否定後読み「(?現在の位置の直前に指定パターンが来ない場合にマッチするゼロ幅アサーションです。
否定後読みの使用例
(?<!\$)\d+ :ドル記号の後に来ない数字にマッチ(値段以外の数字を検索)
(?<!un)happy :「unhappy」の「happy」にはマッチしない「happy」にマッチ
| 否定の種類 | 記法 | 対象 | 主な用途 |
|---|---|---|---|
| 文字クラス否定 | [^…] | 1文字 | 特定文字以外の文字に簡単にマッチ |
| 否定先読み | (?!…) | 位置(直後) | 特定パターンに続かない文字列を検索 |
| 否定後読み | (?<!…) | 位置(直前) | 特定パターンに先行されない文字列を検索 |
否定パターンの実践的な活用例
続いては、否定パターンを実際の場面でどう活用するか、具体的な例を交えて確認していきます。
ログから特定エラーを除外して検索
ログファイルから「ERROR」を含むが「TimeoutError」を含まない行を検索したい場合は以下のようなパターンが使えます。
「^(?!.*TimeoutError).*ERROR.*$」というパターンで、TimeoutErrorを含まないERROR行のみを抽出できます。
特定の拡張子を除外したファイル名の検索
「.tmp」以外のファイル名を検索したい場合は「^(?!.*\.tmp$).*」というパターンが有効です。
否定先読みをうまく組み合わせることで、複雑な除外条件を持つ文字列検索を1つの正規表現で実現できます。
まとめ
正規表現の否定は文字クラス否定・否定先読み・否定後読みの3つの方法で実現でき、それぞれ対象と使い方が異なります。
文字クラス否定は1文字単位のシンプルな否定に、否定先読みと否定後読みは複数文字のパターンを含まない検索や位置条件の否定に活用できます。
否定パターンを正しく使いこなすことで、肯定マッチングだけでは実現できない高度なテキスト処理が可能になるでしょう。
正規表現チェッカーで実際に試しながら、否定パターンの動作を体感してみてください。