特定のパターンを除外するパターンで一致する正規表現式 - 否定先読みの利用
正規表現で特定のパターンを除外したパターンで一致する式を紹介します。
概要
正規表現で全体のパターンの中で除外したいパターンを除いた一部のパターンに一致させたい場合があります。
単体の文字の場合は ^ を利用しますが、パターンを否定したい場合には、「否定先読み」を利用すると実装できます。
メモ
単体の文字の否定
^
の利用方法は
こちらの記事を参照してください。
否定先読みの書式
?!
を記述します。
通常は、ブロックの前に式がおかれるため、次の形式となります。
否定後読みとの違い
否定後読みは、(?<!...)
ブロックの後ろに式があり、否定先読みのパターンに一致しないが、後に続く式に一致した場合に一致したと判定されます。
例1
"PenguinBook"以外の"Penguin*" に一致させたいです。この場合、以下の正規表現式を利用します。
実行結果
次の結果になります。
文字列 | マッチするか |
PenguinArt | 〇 |
PenguinCookie | 〇 |
PenguinBook | × |
PenguinJump | 〇 |
DuckArt | × |
DuckBook | × |
CookPenguinArt | 〇 |
CookPenguinBook | × |
実行結果(置換の場合)
置換の場合は、否定先読みのブロック部分はマッチ範囲ととなりません。
置換文字列を"Hawk"とした場合、次の結果になります。
文字列 | マッチするか | 置換後の文字列 |
PenguinArt | 〇 | HawkArt |
PenguinCookie | 〇 | HawkCookie |
PenguinBook | × | PenguinBook |
PenguinJump | 〇 | HawkJump |
DuckArt | × | DuckArt |
DuckBook | × | DuckBook |
CookPenguinArt | 〇 | CookHawkArt |
CookPenguinBook | × | CookPenguinBook |
例2
&#x(16進数);
以外の
&
にマッチさせたいです。この場合、以下の正規表現式を利用します。
実行結果
置換文字列を"&"とした場合、次の結果になります。
文字列 | マッチするか | 置換後の文字列 | 補足 |
J | × | J | |
⽈ | × | ⽈ | &#x2F48; |
&#xZZZ; | 〇 | &#xZZZ; | |
ģ | 〇 | &#x123 | 末尾のセミコロンがないためマッチする |
Penguin&Docuk | 〇 | Penguin&Docuk | |
&Opt | 〇 | &Opt | |
#AA09; | × | #AA09; | |
補足
&#x(16進数);
&#X(16進数);
&#(10進数);
を除く
&
にマッチするパターンは以下の式になります。
正規表現式
&(?!#((x|X)[0-9a-fA-F]*;|[0-9]*;))
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用