2021-02-25
正規表現で直前/直後の文字をフィルタしたいときは行頭/行末の可能性を明示する
正規表現による検索をかけることがある。
きわめて初歩的ながら仕様を知らずに検索漏れが発生しそうになってしまったのでメモする。
たとえばいま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](https://docs.microsoft.com/en-us/visualstudio/ide/using-regular- expressions-in-visual-studio?view=vs-2019)
Match any character that is not in a given set of characters.
ふむ、/[^abc]/
は character に一致するのであって、改行とか行末には一致しないのか。
ということで必要だった表現は/cool($|[^\?])/
ということみたいです。
cool # <= hit
cool.strong # <= hit
cool? # <= not hit
省略するが行頭でもまったく同じ話なので、例えば/(^|[^_])cool/
のように書く必要がある。