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

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

概要

正規表現で全体のパターンの中の一部のパターンにマッチした場合以外をマッチさせたい場合があります。
単体の文字の場合は ^ を利用しますが、パターンを否定したい場合、パターン以外のものにマッチさせたい場合には、「否定後読み」を利用すると実装できます。

否定後読みの書式

(?<!パターン)

?<!を記述します。

通常は、ブロックの後に式が続くため、次の形式となります。
(?<!パターン)パターン

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

例1

abc123 以外のパターンにマッチさせたいです。
この場合、以下の正規表現式を利用します。
正規表現式
(?<!abc)123
ヒント
否定部分が1文字の場合、a123 b123 c123 以外にマッチさせる場合には、 ^ 演算子を利用できます。詳しくはこちらの記事を参照して下さい。

実行結果

置換文字列を"OK"とした場合、次の結果になります。
文字列マッチするか置換後の文字列
a123aOK
b123bOK
c123cOK
abc123×abc123
abc1234×abc1234
Xabc1234×Xabc1234
aba123abaOK
XYZabc123PQR×XYZabc123PQR

例2

abc123 xyz123 以外のパターンにマッチさせたいです。
この場合、以下の正規表現式を利用します。複数のパターンのORをとる場合は|演算子を利用します。
正規表現式
(?<!abc|xyz)123

実行結果

置換文字列を"OK"とした場合、次の結果になります。
文字列マッチするか置換後の文字列
a123aOK
c123cOK
abc123×abc123
Xabc1234×Xabc1234
aba123abaOK
XYZabc123PQR×XYZabc123PQR
x123xOK
z123zOK
xyz123×xyz123
Axyz1239×Axyz1239
xz123xzOK
xyz987×xyz987

例3

ponta 以外の *ta にマッチする正規表現式は次の通りです。
正規表現式
(?<!pon)ta

実行結果

置換文字列を"OK"とした場合、次の結果になります。
文字列マッチするか置換後の文字列
pentapenOK
ponta×ponta
pntapnOK
printaprinOK
porontaporonOK
zponta×zponta
3ponta×3ponta
anapontap×anapontap
petitapetiOK
otaoOK
著者
iPentecの企画・分析担当。口が悪いのでなるべく寡黙でありたいと思っている。が、ついついしゃべってしまい、毎回墓穴を掘っている。
最終更新日: 2024-01-23
作成日: 2022-05-05
iPentec all rights reserverd.