はじめに
一般的な正規表現では、
ファイル先頭:\A
ファイル末尾:\Z
の表現があるそうですが、Visual Studio Code検索欄の正規表現では利用できませんでした。
他の記述方法で、ファイル先頭とファイル末尾にヒットする記述方法を探しましたので、本記事に残しておきます。
結論
ファイル先頭にマッチ:
^(?<!\n)
ファイル末尾にマッチ:
$(?!\n)
説明
ファイル先頭の正規表現
この記述でファイル先頭にマッチしました。
^(?<!\n)
は「行頭」を意味します。^
否定後読みの記法を使って、「"2行目以降の行頭を除外"した行頭」を検索します。
具体例を見た方が分かりやすいです。
(追加で分かりやすくするために、改行文字をnとして、各行の文字を1行に連結しています。)
として、カッコ内に記述したpatternを肯定後読みで検索すると、patternの一個右にマッチします。(?<=\n)
として否定後読みにすることで、patternの一個右を除外します。(?<!\n)
patternの前に、「行頭」にマッチする
を記述することで、改行文字の一個右にある行頭(つまり、2行目以降の行頭)が除外された上で、残ったすべての行頭がマッチします。^
つまり、1行目の行頭しかマッチしません。
つまり、ファイル先頭にマッチします。
(オマケ)
反対に、肯定後読みで検索すると、改行文字の一個右にあるすべての行頭、つまり、2行目以降の行頭にマッチするんですね。
ファイル末尾の正規表現
この記述でファイル末尾にマッチしました。
$(?!\n)
は「行末」を意味します。$
否定先読みの記法を使って、「"改行文字が次に続かない"行末」を検索します。
先読みなので、まずはすべての「行末」を検索します。次に、否定なので、その一個右に「改行」があるものは除外されます。
最終行以外は次の行がある、つまり、行末の隣に改行文字があるので、「最終行の行末」だけがマッチします。
つまり、ファイル末尾にマッチします。
いつ使うの?
複数のファイルのファイル先頭(末尾)に、一斉に特定の文字列を挿入する時に使えます。
例えば、すべての.cファイルの先頭にCopyrightのコメント分を挿入しなくちゃいけなくなった!時など。
スクリプトをわざわざ書かなくても、エディタの置換操作でサッと一斉挿入できます。
Shift+Ctrl+H で「フォルダーを指定して置換」を立ち上げ、検索対象に「ファイル先頭」を指定し、「"挿入したい文字列"+"改行"」を置換後の文字列として指定すればできますね。
置換後の文字列を"挿入したい文字列"だけにすると、ただのファイル先頭行の行頭への挿入になるので、行の挿入として振る舞うように、「"挿入したい文字列"+"改行"」としています。
参考サイト
- https://docs.microsoft.com/ja-jp/visualstudio/ide/using-regular-expressions-in-visual-studio
- Microsoft Visual Studio 正規表現の公式仕様解説。
- Match the beginning of a file in a VSCode regex search
- ファイル先頭にマッチする正規表現が質問されています。
- 正規表現の先読み・後読みを極める!
- 先読み/後読み の解説。
コメント