正規表現で直前/直後の文字をフィルタしたいときは行頭/行末の可能性を明示する

VS Code正規表現による検索をかけることがある。

きわめて初歩的ながら仕様を知らずに検索漏れが発生しそうになってしまったのでメモする。


たとえばいま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/のように書く必要がある。