正規表現 先読み後読み

パターンの一部にマッチしない場合にマッチする正規表現式 - 正規表現で特定のパターン以外のパターンにマッチする (否定先読みの利用) - 正規表現

正規表現で特定のパターン以外のパターンにマッチする式を紹介します。

概要

正規表現で全体のパターンの中の一部のパターンにマッチした場合以外をマッチさせたい場合があります。
単体の文字の場合は ^ を利用しますが、パターンを否定したい場合、パターン以外のものにマッチさせたい場合には、「否定先読み」を利用すると実装できます。
メモ
単体の文字の否定 ^ の利用方法はこちらの記事を参照してください。

否定先読みの書式

(?!パターン)
?! を記述します。

通常は、ブロックの前に式がおかれるため、次の形式となります。
パターン(?!パターン)

否定後読みとの違い
否定後読みは、(?<!...)ブロックの後ろに式があり、否定先読みのパターンにマッチしないが、後に続く式にマッチした場合にマッチと判定されます。

例1

"PenguinBook"以外の"Penguin*" にマッチさせたいです。この場合、以下の正規表現式を利用します。
正規表現式
Penguin(?!Book)

実行結果

次の結果になります。
文字列マッチするか
PenguinArt
PenguinCookie
PenguinBook×
PenguinJump
DuckArt×
DuckBook×
CookPenguinArt
CookPenguinBook×

実行結果(置換の場合)

置換の場合は、否定先読みのブロック部分はマッチ範囲ととなりません。 置換文字列を"Hawk"とした場合、次の結果になります。
文字列マッチするか置換後の文字列
PenguinArtHawkArt
PenguinCookieHawkCookie
PenguinBook×PenguinBook
PenguinJumpHawkJump
DuckArt×DuckArt
DuckBook×DuckBook
CookPenguinArtCookHawkArt
CookPenguinBook×CookPenguinBook

例2

&#x(16進数); 以外の & にマッチさせたいです。この場合、以下の正規表現式を利用します。
正規表現式
&(?!#x[0-9a-fA-F]*;)

実行結果

置換文字列を"&amp;"とした場合、次の結果になります。
文字列マッチするか置換後の文字列補足
J×J
×&#x2F48;
&#xZZZ;&amp;#xZZZ;
&#x123&amp;#x123末尾のセミコロンがないためマッチする
Penguin&DocukPenguin&amp;Docuk
&Opt&amp;Opt
#AA09;×#AA09;

補足

&#x(16進数); &#X(16進数); &#(10進数); を除く & にマッチするパターンは以下の式になります。
正規表現式
&(?!#((x|X)[0-9a-fA-F]*;|[0-9]*;))
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2022-02-16
iPentec all rights reserverd.