Next: , Previous: , Up: 目次   [Index]


檢索コマンドと正規表現

*usr_27.txt*	For Vim バージョン 8.1.  Last change: 2019 Jul 14

		     VIM USER MANUAL - by Bram Moolenaar

			    檢索コマンドと正規表現

3 章で檢索パターンについて簡單に說明しました |03.9|。Vim ではもつと複雜な檢索もできます。この章では、よく使はれる檢索パターンについて說明します。詳細な仕樣については |pattern| を參照してください。

|27.1|大文字と小文字を區別しない
|27.2|ファイルの端で折り返す
|27.3|オフセット
|27.4|繰り返しマッチ
|27.5|選擇肢
|27.6|文字範圍
|27.7|文字クラス
|27.8|改行記號にマッチ
|27.9|

大文字と小文字を區別しない

初期設定では大文字と小文字は區別されます。つまり "include" と "INCLUDE" と "Include" は 3 つの別々の單語として扱はれ、檢索してもどれか 1 つにしかマッチしません。 ’ignorecase’ オプションをオンにしてみませう:

:set ignorecase

"include" を檢索すると、"Include" にも "INCLUDE" にも "InClUDe" にもマッチします。(’hlsearch’ オプションをオンにするとパターンにマッチした箇所を簡單に確認できます。)

次のコマンドでオプションをオフにできます:

:set noignorecase

しかしまだ設定は變更せずに、そのまま "INCLUDE" を檢索してみます。"include" を檢索したときとまつたく同じテキストがマッチします。次に ’smartcase’ オプションをオンに設定してみます:

:set ignorecase smartcase

パターンに大文字が含まれてゐるときに限り、大文字と小文字が區別されるやうになります。これは、大文字を入力するのは大文字と小文字を區別したいときだけだらうといふ考へに基づいてゐます。スマートでしょ!

この 2 つのオプションを設定すると次のやうにマッチします:

パターンマッチ
wordword, Word, WORD, WoRd, etc.
WordWord
WORDWORD
WoRdWoRd

パターンの中で指定する

ある特定のパターンの中でだけ大文字と小文字の區別を無視したい場合は、パターンに "\c" をつけます。大文字と小文字を區別したいときは "\C" を使ひます。"\c" と "\C" の指定は ’ignorecase’ と ’smartcase’ の設定よりも優先されます。

パターンマッチ
\Cwordword
\CWordWord
\cwordword, Word, WORD, WoRd, etc.
\cWordword, Word, WORD, WoRd, etc.

"\c" と "\C" の大きな利點はそれがパターンに埋め込まれてゐることです。檢索履歷からパターンを再利用したときなどに、同じ檢索結果を期待できます。’ignorecase’ や ’smartcase’ の設定は影響しません。

Note:
檢索パターンでの "\" の扱ひは ’magic’ オプションに依存します。この章では ’magic’ がオンに設定されてゐることを前提にしてゐます。それが標準設定であり推奬設定です。’magic’ を變更してしまふと今まで使へていた檢索パターンが使へなくなつてしまふかもしれません。

Note:
檢索がなかなか終はらない場合は CTRL-C (Unix) または CTRL-Break (MS-DOSと MS-Windows) で處理を中斷できます。

ファイルの端で折り返す

前方檢索を實行すると現在のカーソル位置から處理が開始し、指定された文字列が檢索されます。そしてファイルの末尾まで檢索が進みます。ファイルの末尾まで檢索しても文字列が見つからない場合は、ファイルの先頭からカーソル位置に向かつて檢索が繼續します。

"n" コマンドを使つて順々に檢索を進めてゐる場合もそのうち最初にヒットした場所に戾つてきます。これに氣がつかないと永遠に檢索を續けることになつてしまひます!そのやうなことがないやうに、次のやうなメッセージが表示されます:

下まで檢索したので上に戾ります

"?" コマンドを使つて逆方向に檢索してゐる場合は次のメッセージが表示されます:

上まで檢索したので下に戾ります

それでも氣づかないことがあるかもしれません。’ruler’ オプションをオンにすると確認しやすくなります:

:set ruler

ウィンドウの右下隅 (ステータスラインがあるときはその中) にカーソルの位置が表示されます。次のやうな表示です:

101,29       84%

最初の數字はカーソルの行番號です。檢索を開始した行番號を覺えておいて、檢索が 1 周してないか確認しませう。

折り返さない

檢索を折り返さないやうにするには次のコマンドを使ひます:

:set nowrapscan

檢索がファイルの末尾に達するとエラーメッセージが表示されます:

E385: 下まで檢索しましたが該當箇所はありません: forever

すべての箇所を檢索したい場合は "gg" でファイルの先頭に移動してからこのメッセージが表示されるまで檢索を繰り返してください。

"?" を使つて逆方向に檢索した場合は次のメッセージが表示されます:

E384: 上まで檢索しましたが該當箇所はありません: forever

オフセット

通常、檢索コマンドを實行すると、パターンにヒットした場所の先頭にカーソルが移動します。オフセットを指定することで別の場所に移動することができます。前方檢索コマンドの "‘/’" の場合、パターンの後ろに "‘/’" とオフセット値を指定します:

/default/2

"default" といふパターンが檢索され、見つかつた場所から 2 行下の行頭にカーソルが移動します。例へばこのコマンドで今讀んでゐる段落を檢索すると、1 行目に "default" が見つかるので、カーソルはその 2 行下 (つまりこの行) に移動することになります。

オフセットに數値を指定すると、マッチした行から指定した行數だけ移動した行の行頭にカーソルが移動します。オフセット値には負の數も指定できます。正の數ならカーソルが下に移動し、負の數なら上に移動します。

文字オフセット

"e" はマッチした文字列の末尾を示すオフセットです。マッチした文字列の末尾にカーソルが移動します。次のやうに使ひます:

/const/e

"const" の "t" にカーソルが移動します。

オフセットに數値を足すと、その場所からさらにカーソルを進めることができます。次のコマンドではマッチした文字列の後ろにカーソルが移動します:

/const/e+1

正の數ならカーソルが右に動き、負の數なら左に動きます。例:

/const/e-1

"const" の "s" にカーソルが移動します。

オフセットに "b" を指定すると、マッチした文字列の先頭に移動できます。これはオフセット指定無しの動作と同じなので單體では使ひ道はありません。數値を足したり引いたりしたい場合に使ひます。指定した數だけカーソルを前後に移動できます。例:

/const/b+2

マッチした文字列の先頭から 2 文字右にカーソルが移動します。つまり "n" の上です。

繰り返し

直前に使つた檢索パターンを、別のオフセットを使つて再檢索したい場合は、パターン指定を省略します:

/that
//e

これは次の指定と同じです:

/that/e

同じオフセットを使つて再檢索したい場合は:

/

"n" と同じ動作になります。オフセット指定を無效にして再檢索したい場合は次のやうにします:

//

後方檢索

"?" コマンドでも同じやうにオフセットを指定できますが、パターンとオフセットを區切るのは "/" ではなく "?" になります:

?const?e-2

"b" と "e" の意味は同じです。"?" を使ふ場合でも方向は逆になりません。

檢索開始位置

檢索は通常、現在のカーソル位置から開始します。オフセットを指定するとうまくいかないときがあります。例:

/const/-2

"‘const’" を檢索してその 2 行上に移動します。"n" を使つて再檢索すると、その場所から檢索を開始して同じ場所の "‘const’" がヒットします。そして、再びオフセットが適用されて元の場所に戾つてきます。まつたく移動できません。

次の行に "‘const’" があつた場合はもつとをかしなことになります。檢索を實行すると次の行がヒットして、その 2 行上にカーソルが移動するので、カーソルが逆方向に移動してしまふのです。

文字オフセットを使つた場合はさうなりません。オフセット指定の分だけ檢索開始位置がずれるので、同じものが再びヒットすることはありません。

繰り返しマッチ

ある文字を任意の數だけマッチさせたい場合は "*" を使ひます:

/a*

これは "a" でも "aa" でも "aaa" でもマッチします。0 回といふのも任意の數に含まれるので "" (空文字列) もマッチします。

"*" は直前の文字に對してだけ適用されます。"ab*" なら "a"、"ab"、"abb"、"abbb" などがマッチします。單語を繰り返したい場合は、その單語をグループにまとめなければなりません。"‘\(’" と "‘\)’" で單語を圍んでください。次のやうに使ひます:

/\(ab\)*

"ab"、"abab"、"ababab"、"" などにマッチします。

空文字列にマッチさせたくない場合は "‘\+’" を使ひます。直前の文字が 1 つ以上あるときだけマッチするやうになります:

/ab\+

"ab"、"abb"、"abbb" などにマッチします。"b" が後ろに付いてゐない "a" にはマッチしません。

0 または 1 つの文字にマッチさせたい場合は "\=" を使ひます。例:

/folders\=

"folder" と "folders" がマッチします。

回數指定

特定の數だけ文字をマッチさせるには "\{n,m}" を使ひます。"n" と "m" に數字を指定します。直前の文字が "n" から "m" の數だけ連續してゐる場合にマッチします。|inclusive|

例:

/ab\{3,5}

"abbb"、"abbbb"、"abbbbb" にマッチします。 "n" を省略した場合は 0 が使はれます。"m" が省略された場合は繰り返し回數は無制限になります。",m" を省略した場合は、正確に "n" 回の繰り返しにマッチします。 例:

patternmatch count
\{,4}0, 1, 2, 3 or 4
\{3,}3, 4, 5, etc.
\{0,1}0 or 1 (\= と同じ)
\{0,}0 以上 (* と同じ)
\{1,}1 以上 (\+ と同じ)
\{3}3

最短一致

今まで說明した繰り返し指定は、可能な限りたくさんの文字列にマッチしようとします。できるだけ少ない回數だけマッチさせるには "\{-n,m}" を使ひます。動作は "\{n,m}" とほとんど同じですが、最短一致が使はれます。 例:

/ab\{-1,3}

"abbbb" の中の "ab" だけがマッチします。1 つの "b" にマッチするだけで條件を滿たすので、2 つ目以降の "b" には絕對にマッチしません。後ろに他のパターンが續いてゐるなら最小回數以上の文字にもマッチします。

"n" と "m" を省略した場合も同じルールが適用されます。兩方の數字を省略して "\{-}" とすることもできます。これは直前の文字が 0 回以上繰り返されてゐる場合に最小の數だけマッチします。單體で使つた場合は常に 0 回にマッチします。他のパターンと組み合はせて使ふと便利です。例:

/a.\{-}b

"axbxb" の中の "axb" にマッチします。次のパターンを使つた場合は:

/a.*b

".*" は可能な限り多くの文字にマッチするので "axbxb" 全體がマッチします。

選擇肢

パターンの中で "or" (または) を指定するには "‘\|’" を使ひます。例:

/foo\|bar

"foo" と "bar" のどちらかがマッチします。複數の選擇肢を指定できます:

/one\|two\|three

"one"、"two"、"three" のどれかにマッチします。 複數回マッチさせるには、全體を "‘\(’" と "‘\)’" で圍みます:

/\(foo\|bar\)\+

"foo"、"foobar"、"foofoo"、"barfoobar" などにマッチします。 もう 1 つの例:

/end\(if\|while\|for\)

"endif"、"endwhile"、"endfor" にマッチします。

"‘\&’" も似たやうな條件指定です。指定された選擇肢がすべて同じ場所でマッチします。マッチ結果としては最後の選擇肢が使はれます。例:

/forever\&...

"forever" の "for" にマッチします。"fortuin" にはマッチしません。

文字範圍

"a"、"b"、"c" のどれかにマッチさせるには "/a\|b\|c" が使へます。しかし "a" から "z" までの文字をマッチさせようとするとパターンが長くなつてしまひます。簡單な方法があります:

/[a-z]

[]’ は 1 つの文字にマッチします。マッチさせたい文字を ‘[]’ の中に指定します。次のやうにして文字を 1 つずつ指定することもできます:

/[0123456789abcdef]

指定された文字の中から 1 つがマッチします。文字が連續してゐる場合は文字範圍を指定できます。例へば "0-3" は "0123" といふ意味です。"w-z" は "wxyz" といふ意味になります。上記の例は次のやうに短くできます:

/[0-9a-f]

文字 "‘-’" 自體をマッチさせたい場合は ‘[]’ の中の一番最初か最後に書いてください。‘[]’ の中では以下の特殊文字が使へます (これらは ‘[]’ の中でなくても使へます):

\e<Esc>
\t<Tab>
\r<CR>
\b<BS>

[]’ の中では他にも特殊な指定方法が使へます。詳細は |/[]| を參照してください。

文字範圍の補集合

マッチして欲しくない文字を指定したい場合は、文字範圍の先頭に "^" を指定します。すると、指定した文字以外の文字がマッチするやうになります。例:

/"[^"]*"
"ダブルクォート
[^"]ダブルクォート以外の文字が
*可能な限りたくさん
"ダブルクォート

"foo" や "3!x" がマッチします (ダブルクォートもマッチに含まれる)。

定義濟み文字範圍

一般的な文字範圍はあらかじめ定義されてゐます。 例:

/\a

アルファベット文字が檢索されます。これは "/[a-zA-Z]" と同じです。他にも次のやうなものがあります:

itemmatchesequivalent
\d數字[0-9]
\D數字以外[^0-9]
\x16 進數の數字[0-9a-fA-F]
\X16 進數の數字以外[^0-9a-fA-F]
\s空白文字[ ] (<Tab>か<Space>)
\S空白文字以外[^ ] (<Tab>か<Space>以外)
\l小文字アルファベット[a-z]
\L小文字アルファベット以外[^a-z]
\u大文字アルファベット[A-Z]
\U大文字アルファベット以外[^A-Z]

Note:
定義濟み文字範圍は普通の文字範圍よりも處理が高速です。 これらのアイテムは ‘[]’ の中では指定できません。つまり "[\d\l]" と書いたとしても數字と小文字にはマッチしません。"\(\d\|\l\)" を使つてください。

定義濟み文字範圍の一覽は |/\s| を參照してください。

文字クラス

文字範圍は特定の文字のセットにマッチします。文字クラスも似たやうなものですが、檢索パターンを變更せずに文字のセットを變更できるといふ違ひがあります。 例へば、次のパターンを檢索します:

/\f\+

"\f" はファイル名に使へる文字を表します。つまりこのパターンはファイル名として使へる文字列にマッチします。

どの文字がファイル名として使へるかはシステムによつて異なります。MS-Windows では "\" が使へますが Unix では使へません。これは ’isfname’ オプションで指定されてゐます。Unix の初期設定:

:set isfname
isfname=@,48-57,/,.,-,_,+,,,#,$,%,~,=

他のシステムでは初期設定が變はります。ファイル名にマッチさせたいときに "\f" を使へば、そのパターンはいろいろなシステムで使へます。

Note:
Unix では空白などのどんな文字でもファイル名に使へます。’isfname’ にそ れらの文字を設定するのは理論的には正しいことです。しかしその場合、テキストの中からファイル名を切り出すのが困難になつてしまひます。したがつて、’isfname’ の初期設定にはすべての文字は含まれてゐません。

次のやうな文字クラスがあります:

itemmatchesoption
\i識別子に使へる文字isident
\I\i から數字を拔いたもの
\kキーワードとなる文字iskeyword
\K\k から數字を拔いたもの
\p印字可能文字isprint
\P\p から數字を拔いたもの
\fファイル名に使へる文字isfname
\F\f から數字を拔いたもの

改行記號にマッチ

改行を含んだパターンを檢索することができます。改行の位置は明示的に指定する必要があります。今までに說明したパターンアイテムはどれも改行にマッチしません。

改行の場所を指定するには "\n" を使ひます:

/one\ntwo

行末が "one" で終はり、次の行の行頭が "two" になつてゐる行がマッチします。"one two" にもマッチさせたい場合は、スペースと改行の兩方をマッチさせる必要があります。それには "\_s" を使ひます:

/one\_stwo

閒に空白をいくつでも挾めるやうにするには:

/one\_s\+two

これは、行末が "‘the ’" で終はり、次の行の行頭が "‘ word’" で始まつてゐるやうな場所にもマッチします。

"\s" は空白にマッチします。"\_s" は空白と改行にマッチします。同樣に、"\a" はアルファベットにマッチし、"\_a" はアルファベットと改行にマッチします。他の文字クラスや文字範圍も同樣に、"_" を付けることによつて改行にもマッチするやうになります。

他の多くのパターンアイテムも "\_" を付けることによつて改行にマッチさせることができます。例へば、"\_." は改行を含めたすべての文字にマッチします。

Note:
"\_.*" はファイル末尾までのすべての文字がマッチします。檢索コマンドの動作が遲くなるかもしれないので注意してください。

"\_[]" を使ふと文字範圍にも改行を追加できます:

/"\_[^"]*"

ダブルクォートで圍まれたテキストが檢索されます。閒には改行も含むことができます。

便利さうな檢索パターンをいくつか說明します。今までに說明したパターンをどのやうに使へばいいかを示します。

カリフォルニア州のナンバープレートを探す

"1MGU103" といふ番號を檢索してみます。これは 1 つの數字、3 つの大文字アルファベット、3 つの數字、から成つてゐます。そのままパターンに置き換へてみます:

/\d\u\u\u\d\d\d

同じものが竝んでゐる部分は回數指定に置き換へることができます:

/\d\u\{3}\d\{3}

[]’ 指定を使ふこともできます:

/[0-9][A-Z]\{3}[0-9]\{3}

あなたならどれを使ひますか? どれでも覺えやすいものを使つてください。簡單に覺えられる方法を使ふ方がさうでないものを頑張つて覺えるよりずつと效率がよくなります。最後の例は他より長くて實行速度も遲いので、どれでも覺えられるといふ場合は選擇肢から外してください。

識別子を見つける

C 言語 (などのほとんどの言語) では、識別子は英文字で始まつてその後に英數字が續きます。アンダースコアも使へるかもしれません。次のパターンでそのやうな文字を檢索できます:

/\<\h\w*\>

"\<" と "\>" は單語全體をマッチさせるための指定です。"\h" は "[A-Za-z_]" と同じ意味で、"\w" は "[0-9A-Za-z_]" と同じ意味になります。

Note:
"\<" と "\>" の動作は ’iskeyword’ オプションに依存します。例へば "-" が含まれてゐる場合、上記パターンは "ident-" にマッチしません。次のパターンを使つてください:

/\w\@<!\h\w*\w\@!

識別子の前後の文字が "\w" にマッチしないかどうかをチェックしてゐます。 |/\@<!| と |/\@!| 參照。


Next: , Previous: , Up: 目次   [Index]