syghの新フラグメント置き場

プログラミングTipsやコード断片の保管場所です。お絵描きもときどき載せます。

Visual Studio正規表現の否定先読み

(これは2010-08-06に書いた故OCNブログの記事を移植したものです)

ある文字列を「含まない」行を正規表現Regex)で検索したいとき、先読み機能が使えるPerlPython、.NET、ECMAScriptなどでは、下記のようにします。

^((?!foo).)*$

先読み機能がないと、かなり面倒になります。

Visual StudioRegexにも、一応似たような否定先読み機能があるみたいです。

^(~(foo).)*$

Visual StudioRegexはプログラミングに特化した方言になっている模様。*1


ちなみに、EOF(End of File)の直前が改行でないようなファイルを検索したい場合、例えばファイル末尾が

}[EOF]

とか

//[EOF]

とかになっているものを検索したいとき、Visual Studioでは

.+~(\n)$

という正規表現になります。

改行で終わらない行はしばしば問題を引き起こすことがある(ソースファイルをパースするコンパイラアセンブラだけに限らない)ので、理解のあるプログラマならば、自分の書いたソースファイルを編集するときには常に注意しているものですが、他人が書いたコードを保守する場合など、不整合のあるファイルを一括検索したいときにはこういった正規表現が役立ちます。

www.kijineko.co.jp

※2021-06-28追記:
VS2017以降は標準でEditorConfigに対応しているので、insert_final_newline=trueに設定した .editorconfig ファイルを配置しておくのがベストです。

docs.microsoft.com

*1:Visual Studio 2010までは、独自の正規表現構文になっていました。2012以降はVisual Studioマクロの廃止と併せて、.NET同等の正規表現構文に仕様変更されたようです。