Vimで正規表現検索を使いこなす方法|パターン検索の完全ガイド

プログラミング・IT

Vimで文字列検索をしていて、こんな場面に遭遇したことはありませんか?

  • 「数字だけの行を全部見つけたい」
  • 「メールアドレスっぽい文字列を探したい」
  • 「特定のパターンに合致する行だけ抽出したい」

こんなときに威力を発揮するのが正規表現(Regular Expression)です。

Vimの正規表現を使えば、単純な文字列検索では不可能な、柔軟で強力な検索ができるようになります。

この記事では、Vimの正規表現検索を基本から実践的な使い方まで詳しく解説します。

スポンサーリンク

正規表現とは?なぜVimで必要?

正規表現の基本概念

正規表現とは

文字列のパターンを表現するための特殊な記法です。
「この位置に数字」「この文字の繰り返し」といった条件を、記号を使って表現できます。

普通の検索との違い

# 普通の検索
/cat         # "cat"という文字列そのものを検索

# 正規表現検索
/c.t         # "c" + 任意の1文字 + "t" にマッチ
             # → "cat", "cut", "cot" などに一致

Vimで正規表現が特に有用な理由

コーディング作業

  • 変数名のパターン検索
  • コメント行の抽出
  • 特定の書式のチェック

ログ解析

  • エラー行の抽出
  • 特定時間帯のログ検索
  • IPアドレスやURLの検索

文書編集

  • 見出し行の検索
  • 特定形式のデータ抽出
  • 校正・校閲作業

Vimでの検索基本操作

基本的な検索コマンド

下方向検索

/検索パターン

カーソル位置から下に向かって検索

上方向検索

?検索パターン

カーソル位置から上に向かって検索

検索結果の移動

n    # 次の検索結果へ
N    # 前の検索結果へ

検索の終了

:noh  # ハイライト解除

検索時の便利な設定

検索をより便利にする設定

" .vimrcに追加推奨
set ignorecase    " 大文字小文字を無視
set smartcase     " 大文字が含まれていたら区別する
set incsearch     " インクリメンタル検索(入力中に検索)
set hlsearch      " 検索結果をハイライト

Vim正規表現の基本記号

基本的なメタ文字

記号意味マッチする文字列
.任意の1文字/h.that, hit, hot, h1t
*直前文字の0回以上繰り返し/go*dgd, god, good, goood
\+直前文字の1回以上繰り返し/go\+dgod, good, goood
\?直前文字の0回または1回/colou\?rcolor, colour
\{n,m}直前文字のn回以上m回以下/go\{2,4}dgood, goood, gooood

位置指定メタ文字

記号意味マッチする行
^行頭/^The“The”で始まる行
$行末/end$“end”で終わる行
\<単語の開始/\<cat“cat”で始まる単語
\>単語の終了/cat\>“cat”で終わる単語

文字クラス

記号意味マッチする文字
[abc]a, b, c のいずれか/[aeiou]母音1文字
[a-z]a から z までの範囲/[0-9]1桁の数字
[^abc]a, b, c 以外/[^0-9]数字以外の文字
\d数字/\d\+1つ以上の数字
\D数字以外/\D数字以外の1文字
\w単語文字(英数字_)/\w\+単語
\W単語文字以外/\W空白や記号
\s空白文字/\s\+1つ以上の空白
\S空白文字以外/\S空白以外の1文字

グループ化と選択

記号意味マッチする文字列
\(...\)グループ化/\(cat|dog\)cat または dog
|OR条件/red|bluered または blue

実践的な検索例

レベル1: 基本的なパターン検索

空行を検索

/^$

何も書かれていない行を検索

空白のみの行を検索

/^\s*$

空白文字(スペースやタブ)のみの行を検索

数字のみの行を検索

/^\d\+$

数字だけで構成された行を検索

コメント行を検索(#で始まる行)

/^\s*#

行頭に#があるコメント行を検索(前に空白があってもOK)

レベル2: 実用的なパターン検索

メールアドレス風の文字列

/\w\+@\w\+\.\w\+

user@domain.com のような形式を検索

URL風の文字列

/https\?:\/\/[a-zA-Z0-9.-]\+

IPアドレス風の文字列

/\d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}

xxx.xxx.xxx.xxx の形式を検索

日付形式の検索(YYYY-MM-DD)

/\d\{4}-\d\{2}-\d\{2}

2024-01-15 のような日付形式を検索

レベル3: プログラミング関連

関数定義を検索(JavaScript)

/function\s\+\w\+\s*(

“function 関数名(” の形式を検索

変数宣言を検索(多言語対応)

/\(var\|let\|const\)\s\+\w\+

var, let, const で始まる変数宣言を検索

TODO・FIXMEコメントを検索

/\(TODO\|FIXME\|XXX\).*

TODO:, FIXME:, XXX: などのマークを検索

HTMLタグを検索

/<\w\+[^>]*>

<tag> のようなHTMLタグを検索

検索と置換の組み合わせ

基本的な置換構文

基本形

:%s/検索パターン/置換文字列/g
  • %: ファイル全体
  • s: substitute(置換)
  • g: global(行内のすべての一致を対象)

実用的な置換例

複数の空白を1つに統一

:%s/\s\+/ /g

連続する空白文字を1つの半角スペースに置換

行末の不要な空白を削除

:%s/\s\+$//g

各行の末尾にある空白文字を削除

タブを4つのスペースに変換

:%s/\t/    /g

タブ文字を4つの半角スペースに置換

HTMLタグを削除

:%s/<[^>]*>//g

すべてのHTMLタグを削除

高度な置換テクニック

キャプチャグループを使った置換

:%s/\(\w\+\)\s\+\(\w\+\)/\2 \1/g

“first second” → “second first” のように単語を入れ替え

条件付き置換

:%s/old/new/gc

確認しながら置換(y/n/a/q/lで選択)

特定の行範囲での置換

:10,20s/old/new/g    " 10行目から20行目まで
:.,+5s/old/new/g     " 現在行から5行下まで

高度な検索テクニック

前方先読み・後方先読み

前方先読み(lookahead)

/\w\+\ze@

@ の前にある単語を検索(@自体は含まない)

後方先読み(lookbehind)

/\zs\w\+@

@ を含む単語の @ 以降を検索

特殊な検索モード

Very Magic モード

/\v(cat|dog)

\v を付けると多くの記号がメタ文字として扱われる

Very Nomagic モード

/\V.+*

\V を付けるとほとんどの記号が文字通りの意味になる

検索履歴の活用

検索履歴を開く

q/    " 検索履歴ウィンドウを開く
q?    " 逆方向検索履歴ウィンドウを開く

履歴から再検索

/<Up>    " 前回の検索パターンを呼び出し

よくある検索パターン集

ログ解析でよく使うパターン

エラーログの検索

/\c\(error\|fatal\|exception\)

大文字小文字を無視してエラー系キーワードを検索

特定時間のログ検索

/2024-01-15\s\+\d\{2}:\d\{2}:\d\{2}

特定日時のログエントリを検索

IPアドレスでアクセス元を検索

/\d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}

コーディングでよく使うパターン

未使用変数の検索

/\<\w\+\>\s*=.*;\s*$

代入されているが使われていない可能性のある変数

長すぎる行の検索

/^.\{81,}$

80文字を超える行を検索

デバッグ用コードの検索

/\(console\.log\|debugger\|print\)

デバッグ用の出力コードを検索

文書編集でよく使うパターン

見出し行の検索

/^#\+\s

Markdown形式の見出し行を検索

箇条書きの検索

/^\s*[-*]\s

リスト形式の行を検索

重複行の検索

/^\(.*\)\n\1$

同じ内容の連続した行を検索

トラブルシューティング

よくある問題と解決法

問題1: メタ文字が効かない

原因: Vimの正規表現モードの設定

# 解決法: Very Magic モードを使用
/\v(your_pattern)

問題2: 検索結果が多すぎる

原因: パターンが曖昧すぎる

# 悪い例
/.+

# 良い例:より具体的なパターン
/\w\+@\w\+\.\w\+

問題3: 特殊文字をリテラル検索したい

解決法: バックスラッシュでエスケープ

/\$100    # $100 をリテラル検索
/\[test\] # [test] をリテラル検索

パフォーマンスの注意点

重い検索パターンを避ける

# 避けるべき: 非常に重い
/.*.*.*text

# 推奨: より効率的
/\w*text\w*

長大ファイルでの検索

  • 可能であれば範囲指定
  • より具体的なパターンを使用
  • 必要に応じて :set incsearch を無効化

実践演習

演習1: 基本的なパターン検索

以下のテキストから指定されたパターンを検索してみましょう:

user1@example.com
user2@test.org
192.168.1.1
2024-01-15
TODO: Fix this bug
function getName() {
var age = 25;
let count = 0;

練習問題

  1. メールアドレスを検索する正規表現
  2. 日付形式を検索する正規表現
  3. 変数宣言を検索する正規表現

解答例

1. /\w\+@\w\+\.\w\+
2. /\d\{4}-\d\{2}-\d\{2}
3. /\(var\|let\)\s\+\w\+

演習2: 実際のファイルでの練習

ステップ1: サンプルファイルの作成

# sample.txt を作成
cat << EOF > sample.txt
# This is a comment
function calculateSum(a, b) {
    var result = a + b;
    console.log("Result: " + result);
    return result;
}

// Another comment
let user = {
    name: "John",
    email: "john@example.com",
    age: 30
};

TODO: Add error handling
FIXME: Memory leak issue
EOF

ステップ2: 検索練習

# 1. コメント行を検索
/^\s*\(#\|\/\/\)

# 2. 関数定義を検索
/function\s\+\w\+\s*(

# 3. TODO/FIXMEを検索
/\(TODO\|FIXME\):

# 4. 文字列リテラルを検索
/"[^"]*"

まとめ

Vimの正規表現検索は、テキスト処理の効率を劇的に向上させる強力な機能です。

学習の段階

初級レベル

  • 基本メタ文字(., *, \+, ^, $)をマスター
  • 簡単な検索パターンから始める
  • 検索と移動の基本操作を習得

中級レベル

  • 文字クラスやグループ化を活用
  • 検索と置換を組み合わせる
  • 実際の作業での応用

上級レベル

  • 先読み・後読みを使いこなす
  • 複雑なパターンマッチング
  • パフォーマンスを考慮した最適化

効率的な学習方法

継続的な練習

  1. 日常の作業で積極的に正規表現を使用
  2. 複雑なパターンは段階的に構築
  3. よく使うパターンを自分用リストで管理

リファレンスの活用

:help pattern      " Vimの正規表現ヘルプ
:help regexp       " 正規表現の詳細説明

実践的なアプローチ

  • 具体的な課題から始める
  • エラーを恐れずに実験する
  • 他の人の正規表現パターンを研究

今日から使えるコツ

よく使うパターンを覚える

/^\s*$          # 空行
/\d\+           # 数字
/\w\+@\w\+\.\w\+ # メールアドレス
/https\?://     # URL

コメント

タイトルとURLをコピーしました