前回、Vimの検索では「パターン」と呼ばれる、意味を持った文字列を使った検索が可能であることを紹介した。検索で使えるパターンや、どのような指定ができるのかについては理解していただけたはずだ。

しかし、紹介した全てのパターンを覚えている方はあまりいないだろう。よく使うパターンはそれほど多くなく、大抵はよく使う正規表現の記述を繰り返し利用しているのではないだろうか。今回は、パターンを使った検索の例を取り上げ、具体的な検索方法について解説する。

パターンを使った検索のサンプル

ここでは次のようなHTMLファイルの中身を検索する例を取り上げる。これは本連載の一覧表示を行っているページのHTMLデータだ。

検索で使用するサンプルファイル - 本連載の一覧ページのHTMLデータ

まず、簡単な検索を行ってみる。「100%」という文字列を検索にかけると、次のように一致する文字列を検索することができる。

シンプルな文字列検索を行った場合

「100%」だと、当然ながら99%には一致しないし、0%にも一致しない。「数字%」という表記に一致させたい場合には、パターンを使って表記する必要がある。例えば、ここでは「[1-9][0-9]*%」で検索を行う。検索結果では、次のように「数字%」に一致するようになる。

[1-9][1-9]*%で「数字%」に一致する

[1-9][0-9]*%は、まず最初の[1-9]が、1文字目が1〜9までの何かの数字であることを意味し、[0-9]*で空文字か数字の繰り返しを意味するようになる。つまり、1%以上の「整数%」という表記に一致するようになる。「*」は、「0回以上の繰り返し」を意味しており、何も一致しないか、または1回以上の繰り返しということになる。正規表現でも似たような意味を持っており、応用範囲も広い。便利な指定なので、まず覚えてしまいたい記述の1つだ。

なお、本稿の末尾に前回掲載したのと同じパターン表を掲載しておくので、パターンを使う際の参考にしてもらえればと思う。

次のサンプルは、「http://」と「https://」を同時に検索している例だ。「https\=://」というパターンがこれを可能にしている。

「http://」と「https://」の双方に一致するパターン

「https\=://」のポイントは「\=」の部分だ。「\=」は「0回または1回の繰り返し」を意味するので、「s」があってもなくても、どちらも該当するようになる。「\?」も「\=」と同じなので、「\?」を使ってもよい。たくさんのパターンを覚えるのは無理だと感じたら、「{数以上,数以下}」の指定で全て書くようにするとよい。「{}」を使えば、今回のパターンは「{0,1}」になるから、「https{0,1}://」となる。なるべく覚える努力を減らしたい場合は、繰り返しに関しては「{}」の書き方だけ覚えてしまおう。

次は「[0-9]+.[0-9]+.[0-9]+」の検索例だ。これは「数字.数字.数字」といったバージョン番号を検索するために入力している。「確か3つに別れたバージョン番号スキームだったと思うけれど、一体何のことだったかな……」といった曖昧な記憶のまま検索したい場合などには、こういった使い方もできる。

「数字.数字.数字」で検索している例

「+」は「1回以上の繰り返し」だ。空文字には一致しない。「+」を覚えるのが面倒であれば、「{}」の書き方を使って「{1,1000}」のように書く方法もある。とにかく記憶するパターンを最小限に抑えておきたいなら、やはり「{}」の書き方を覚えるに限る。

パターンが使えるとすごく便利

パターンが使えるようになると検索の柔軟性が一気にアップする。最初から全て覚えることはできないと思うが、覚えておけばおくほど、とても便利である。最低限、「[]」と「{}」は最初に覚えてしまいたい。徐々に慣れたら、「^」「$」「.」「*」「+」「\=」辺りも自然と使えるようになると良いと思う。

最初から全てパーフェクトにパターンを使いこなす必要はない。少しずつ使えるパターンを増やしていって、より検索効率を上げていこう。Vimの検索パターンは正規表現と似ているところも多いので、パターンを習得すれば、自然と正規表現のスキルも向上するはずだ。

Appendix: 検索で使えるパターン

パターン 内容
^ 行頭(パターンの先頭でのみ指定可能)
$ 行末(パターンの末尾でのみ指定可能)
. 任意の1文字(行末には使用できない)
\%^ ファイルの先頭
\%$ ファイルの終了
\%V Visual領域の中
\%# カーソルの位置
\%’m マークm位置
\%数字l 指定行
\%数字c 指定列
\%数字v 指定仮想列
\_^ 行頭(パターンのどこでも指定可能)
\_$ 行末(パターンのどこでも指定可能)
\_. 任意の1文字(行末としても指定可能)
\< 単語の先頭
\> 単語の末尾
\zs 一致の開始を指定
\ze 一致の終了を指定
\^ ^
\$ $
. .
\e <ESC>
\t <TAB>
\r <CR>
\b <BS>
\n 行末
[] カッコ内に指定した文字のどれかに一致
\c 大文字小文字を区別せずに一致
\C 大文字小文字を区別して一致
\%d 10進数に一致
\%x 16進数に一致
\%o 8進数に一致
\%u マルチバイト文字に一致
\%U ラージマルチバイト文字に一致
\%C 合成文字に一致
\i 識別子文字
\I 識別子文字(数字は含まない)
\k キーワード文字
\K キーワード文字(数字は含まない)
\f ファイル名文字
\F ファイル名文字(数字は含まない)
\p 印刷可能文字
\P 印刷可能文字(数字は含まない)
\s 空白とタブ
\S 空白とタブ以外の文字
\d 数字([0-9])
\D 数字以外([^0-9])
\x 16進数([0-9A-Fa-f])
\X 16進数以外([^0-9A-Fa-f])
\o 8進数([0-7])
\O 8進数以外([^0-7])
\w 単語文字([0-9A-Za-z_])
\W 単語文字以外([^0-9A-Za-z_])
\h 単語の先頭文字([A-Za-z_])
\H 単語の先頭文字以外([^A-Za-z_])
\a アルファベット([A-Za-z])
\A アルファベット以外([^A-Za-z])
\l 小文字アルファベット([a-z])
\L 小文字アルファベット以外([^a-z])
\u 大文字アルファベット([A-Z])
\U 大文字アルファベット以外([^A-Z])
\_d 数字(行末を含む)
\_D 数字以外(行末を含む)
\_x 16進数(行末を含む)
\_X 16進数以外(行末を含む)
\_o 8進数(行末を含む)
\_O 8進数以外(行末を含む)
\_w 単語文字(行末を含む)
\_W 単語文字以外(行末を含む)
\_h 単語の先頭文字(行末を含む)
\_H 単語の先頭文字以外(行末を含む)
\_a アルファベット(行末を含む)
\_A アルファベット以外(行末を含む)
\_l 小文字アルファベット(行末を含む)
\_L 小文字アルファベット以外(行末を含む)
\_u 大文字アルファベット(行末を含む)
\_U 大文字アルファベット以外(行末を含む)
繰り返しパターン 内容
* 直前指定の0回以上の繰り返し(より長い方に一致)
\+ 直前指定の1回以上の繰り返し(より長い方に一致)
\= 直前指定の0回または1回の繰り返し(より長い方に一致)
\? 直前指定の0回または1回の繰り返し(より長い方に一致)
\{n,m} 直前指定のn回以上m回以下の繰り返し(より長い方に一致)
\{n} 直前指定のn回の繰り返し
\{n,} 直前指定のn回以上の繰り返し(より長い方に一致)
\{,m} 直前指定のm回以下の繰り返し(より長い方に一致)
\{} 直前指定の0回以下の繰り返し(より長い方に一致)
\{-n,m} 直前指定のn回以上m回以下の繰り返し(より短い方に一致)
\{-n} 直前指定のn回の繰り返し
\{-n,} 直前指定のn回以上の繰り返し(より短い方に一致)
\{-,m} 直前指定のm回以下の繰り返し(より短い方に一致)
\{-} 直前指定の0回以下の繰り返し(より短い方に一致)