正規表現で直前/直後の文字をフィルタしたいときは行頭/行末の可能性を明示する
きわめて初歩的ながら仕様を知らずに検索漏れが発生しそうになってしまったのでメモする。
たとえばいまcool
というメソッドの呼び出し箇所を調べていたとする。
/cool/
だとこうだ。
cool # <= hit cool.strong # <= hit cool? # <= hit
cool?
という別のメソッドもひっかかるわけだが、これは除外したいとする。
そこで/cool[^\?]/
とすると、こうだ。
cool # <= not hit cool.strong # <= hit cool? # <= not hit
一行目はhitするものかとおもっていたら、一行目もhitしなくなってしまった。
仕様を確認する。
Use regular expressions - Visual Studio | Microsoft Docs
Match any character that is not in a given set of characters.
ふむ、/[^abc]/
はcharacterに一致するのであって、改行とか行末には一致しないのか。
ということで必要だった表現は/cool($|[^\?])/
ということみたいです。
cool # <= hit cool.strong # <= hit cool? # <= not hit
省略するが行頭でもまったく同じ話なので、例えば/(^|[^_])cool/
のように書く必要がある。