Vimの正規表現を「魔法の杖」に変える:テキスト加工の極意
こんにちは。開発環境の深淵を愛する皆さんに、今日はVim(そしてNeovim)における「正規表現」の本当の姿をお話しします。
多くの初心者はVimの正規表現を「検索と置換のための道具」だと思っています。しかし、真のVim使いにとって、正規表現は「テキストを自在に再構築するためのプログラミング言語」です。これをマスターすれば、数百行の修正を数秒で、しかもミスなく完了させることができるようになります。
今日は、Vimの正規表現が持つ「検索パターン置換」の底力に触れていきましょう。
—
1. なぜVimの正規表現を学ぶべきなのか
エディタの置換機能は、ただ文字を入れ替えるだけのものだと思っていませんか?
Vimの置換コマンド(`:substitute`)は、「パターンにマッチした箇所を、動的に生成した文字列で再定義する」ことができます。
例えば、ログファイルのタイムスタンプのフォーマットを一括で変更したり、JSONのキーをスネークケースからキャメルケースに変換したり。一度この快感を覚えると、マウスで範囲選択してちまちま書き換える作業には二度と戻れなくなります。
—
2. 基礎:キャプチャグループで「再利用」する
Vimで最も重要なのは「括弧で囲んで、後から呼び出す」というテクニックです。
Vimの正規表現では、`\(` と `\)` で囲んだ部分が「グループ」としてメモリに保持されます。これを置換文字列の中で `\1` や `\2` と呼び出すのです。
例:`名前=値` という形式を `値: 名前` に入れ替える
対象テキスト:
user=tanaka
id=12345
以下のコマンドを実行してください。
:%s/\v(\w+)=(\w+)/\2: \1/g
” :%s … ファイル全体で置換を実行
” \v … 「very magic」モード。括弧やプラス記法を直感的に使えるようにするVim独自の魔法
” (\w+)=(\w+) … 1番目のグループ(英数字)と2番目のグループ(英数字)を抽出
” \2: \1 … 2番目のグループを先に、1番目を後に配置して置換
この `\v`(very magic)は、Vim特有の正規表現の癖を抑え、一般的な正規表現に近い書き方ができる神設定です。これを使うだけで、生産性は確実に向上します。
—
3. `:global` コマンドとの融合:狙い撃ちの極意
ここからがVimの本領発揮です。`:global`(短縮系 `:g`)コマンドは、「あるパターンに一致した行に対して、別のコマンドを実行する」という強力なツールです。
実践:特定の条件を満たす行だけを加工する
例えば、「TODOコメントが含まれている行だけ、行頭に『[確認]』というタグを付けたい」としましょう。
:g/TODO/s/^/[確認] /
” :g/TODO/ … TODOという文字を含む行を探す
” s/^/[確認] / … その行の行頭(^)を[確認] に置換する
これだけで、ファイル全体をスキャンし、特定の条件に合致した箇所だけをピンポイントで編集できます。これは、複雑なスクリプトを書くよりも遥かに高速で安全です。
—
4. 複数行にまたがる置換:Vimの視界を広げる
初心者が躓くのが「複数行にまたがる置換」です。Vimはデフォルトでは1行単位で処理しますが、正規表現の中で改行を表現することができます。
例:関数呼び出しの引数を折り返す
func(arg1, arg2)
↓
func(
arg1,
arg2
)
これを解決するには、改行を意味する `\_s`(ホワイトスペースと改行を含む)や、特定の文字を跨ぐ処理を組み合わせます。
:%s/(\(\w\+\), \(\w\+\))/(\r \1,\r \2\r)/g
” \r は置換後の改行を意味します。
” これにより、検索パターンで見つけた要素を、改行を挟んで再配置できます。
—
5. 現場ですぐ使える「最強のセットアップ」
まだ `.vimrc` (または `init.lua`) にこの設定を入れていないなら、今すぐ追加してください。これだけでVimの検索・置換体験が劇的に改善します。
” 検索時に大文字小文字を区別しない(ただし大文字が含まれる場合は区別する)
set ignorecase
set smartcase
” 検索時にハイライトする
set hlsearch
” 検索中にインクリメンタルサーチを行う
set incsearch
” 魔法の設定:正規表現のバックスラッシュを減らす(very magicをデフォルトにする)
nnoremap / /\v
vnoremap / /\v
—
最後に:なぜこれを知ることが重要なのか
プログラミングの現場では、コードそのものを書く時間よりも、「既存のコードを書き換える時間」の方が圧倒的に長いです。
正規表現を単なる「検索ツール」としてではなく、「テキスト構造を理解し、再構築する思考ツール」として捉えてください。今日紹介した置換や `:global` のテクニックは、あなたが書くコードの品質を落とさずに、作業スピードだけを10倍、100倍にするための投資です。
まずは、明日からの作業で「手で直している数行」を、あえてこの正規表現で書き換えてみてください。その瞬間、画面の中のテキストが、あなたの意のままに踊り出すのを感じるはずです。
Vimの道は奥が深いですが、その分だけ、あなたを確実に「非凡なエンジニア」へと押し上げてくれます。一緒に楽しんでいきましょう。