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.t | hat, hit, hot, h1t |
* | 直前文字の0回以上繰り返し | /go*d | gd, god, good, goood |
\+ | 直前文字の1回以上繰り返し | /go\+d | god, good, goood |
\? | 直前文字の0回または1回 | /colou\?r | color, colour |
\{n,m} | 直前文字のn回以上m回以下 | /go\{2,4}d | good, 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|blue | red または 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. /\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の正規表現検索は、テキスト処理の効率を劇的に向上させる強力な機能です。
学習の段階
初級レベル
- 基本メタ文字(
.
,*
,\+
,^
,$
)をマスター - 簡単な検索パターンから始める
- 検索と移動の基本操作を習得
中級レベル
- 文字クラスやグループ化を活用
- 検索と置換を組み合わせる
- 実際の作業での応用
上級レベル
- 先読み・後読みを使いこなす
- 複雑なパターンマッチング
- パフォーマンスを考慮した最適化
効率的な学習方法
継続的な練習
- 日常の作業で積極的に正規表現を使用
- 複雑なパターンは段階的に構築
- よく使うパターンを自分用リストで管理
リファレンスの活用
:help pattern " Vimの正規表現ヘルプ
:help regexp " 正規表現の詳細説明
実践的なアプローチ
- 具体的な課題から始める
- エラーを恐れずに実験する
- 他の人の正規表現パターンを研究
今日から使えるコツ
よく使うパターンを覚える
/^\s*$ # 空行
/\d\+ # 数字
/\w\+@\w\+\.\w\+ # メールアドレス
/https\?:// # URL
コメント