📌

小ネタ:正規表現で「前後に〇〇がつくorつかない」のマッチ

2024/01/29に公開

前後の条件を指定して特定文字列を検索したい時が、しばしばあると思います。

具体例

例えばHogeクラスのインスタンスと思われる記述を探したいとします。
単純に考えると、インスタンスは大抵hogeという名前の変数で参照されるので、hogeで検索します
でも似たような名前のFugaHogeクラスとかHogePiyoクラスがあるとfuga_hogehoge_piyoも検索に引っかかってしまってめんどくさいです。
こういう時、_hogeとかhoge_とかは検索結果から除外したいです。

後読み/先読みアサーションを使おう

こういう場合は先読み後読みアサーションが便利です。
上記の例であれば、以下の正規表現により求める結果が得られます。

(?<!_)hoge(?!_)

最初の(?<!_)の部分は後読みアサーションと言って、「hogeの前に_がつかない」にマッチします。
最後の(?!_)の部分は先読みアサーションと言って、「hogeの後に_がつかない」にマッチします。
もちろん「つかない」だけではなく「つく」場合の表現もあり、それぞれ(?<_), (?=_)みたいに書けます。

正規表現便利!

参考

上記以外にもいろんな表現が解説されている大変ありがたいページ🙏🙏🙏
https://www.tohoho-web.com/ex/regexp.html#lookaround_assertion

正直上記ページ見ればいいんだけど、特によく使う気がしたのでユースケース含めてピンポイントで記事にしてみました。

Discussion