*eregex.jax* 日本語ドキュメント ファイル: eregex.vim, eregex_e.vim 作者: AKUTSU toshiyuki バージョン: 2.56 必要なもの: Vim version 6.1 かそれ以降。 説明: eregex.vim は、拡張正規表現を Vim の正規表現に変換します。 eregex_e.vim は、eregex.vim のコマンドを評価します。 1. 使用許諾 |eregex-license-to-use| 2. インストール |eregex-installations| 3. 関数 |eregex-functions| 4. コマンド |eregex-commands| 5. 使い方 |eregex-examples| 6. キーマップ |eregex-keymappings| 7. 原則 |eregex-principle| 8. 内部的な変換を表す一覧 |eregex-table| 9. 特殊なオプションとアトム |eregex-options| 10. マルチライン |eregex-multiline| 11. デリミタの制限 |eregex-limitation-of-delimiter| 12. Vim の正規表現について |eregex-about-vimregex| ============================================================================== 1. 使用許諾 *eregex-license-to-use* eregex.vim と eregex_e.vim の著作権は、作者である AKUTSU toshiyuki に 帰属します。しかし、改変、再配布は自由にしてかまいません。 # GPL とか分かんないのだ。(^^ )>> 作者は本スクリプト(eregex.vim, eregex_e.vim) を使用したことによって生じた いかなる損害について、一切の責任を負いません。 ============================================================================== 2. インストール *eregex-installations* 参考 |add-plugin| (1) UNIX/Linux $HOME/.vim/plugin/eregex.vim $HOME/.vim/plugin/eregex_e.vim $HOME/.vim/doc/eregex_j.txt それから、次のようにして helptags の再構築をします。 :helptags ~/.vim/doc これで、:h :E2v とかできます。 (2) MS-Windows eregex_j.txt は EUC-JP です。 MS-Windows の場合は予め ShiftJIS にしておいてください。 %HOME%\vimfiles\plugin\eregex.vim %HOME%\vimfiles\plugin\eregex_e.vim %HOME%\vimfiles\doc\eregex_j.txt または、 %VIM%\vimfiles\plugin\eregex.vim %VIM%\vimfiles\plugin\eregex_e.vim %VIM%\vimfiles\doc\eregex_j.vim それから、次のようにして helptags の再構築をします。 :helptags $HOME\vimfiles\doc または、 :helptags $VIM\vimfiles\doc これで、:h :E2v とかできます。 ============================================================================== 3. 関数 *eregex-functions* *eregex* *E2v()* E2v({extendedregex} [, {iISCDMm}]) 返り値は Vim の正規表現です。 > :let vimregex = E2v('(?<=abc),\d+,(?=xzy)','i') :echo vimregex \c\%(abc\)\@<=,\d\+,\%(xzy\)\@= < オプションの詳しい説明は |eregex-options| や |eregex-multiline| を見てください。 E2v("","V") 返り値は eregex.vim のバージョンです。 > :echo E2v('','V') 248 < E2v({replacement}, {R1,R2,R3}) これは、:S/pattern/to/ の "to" の部分で使う文字列を返します。 > E2v('\r,\n,\&,&,\~,~', 'R1') => \n,\r,\&,&,\~,~ E2v('\r,\n,\&,&,\~,~', 'R2') => \r,\n,&,\&,~,\~ E2v('\r,\n,\&,&,\~,~', 'R3') => \n,\r,&,\&,~,\~ < ============================================================================== 4. コマンド *eregex-commands* *:E2v* :[range]E2v [iISCDMm] Extended regex To Vim regex. Replace each extended-regex in [range] with vim-style-regex. *:M* :M/eregex[/{offset} [iISCDMm]] Match :M/.*?<\/span>/Im ==> /\C\_.\{-}<\/span> *:S* :[range]S/{eregex}/{string}/[&cegpriISCDMm] Substitute :'<,'>S/(\d{1,3})(?=(\d\d\d)+($|\D))/\1,/g ==> :'<,'>s/\(\d\{1,3}\)\%(\(\d\d\d\)\+\($\|\D\)\)\@=/\1,/g *:G* *:G!* :[range]G/{eregex}/{command} :[range]G!/{eregex}/{command} Global :G/<<-(["'])?EOD\1/,/^\s*EOD\>/:left 8 ==> :g/<<-\(["']\)\=EOD\1/,/^\s*EOD\>/:left 8 *:V* :[range]V/{eregex}/{command} Vglobal ============================================================================== 5. 使い方 *eregex-examples* (1) :E2v コマンド 次の拡張正規表現の行にカーソルを置く。 (\d{1,3})(?=(\d\d\d)+($|\D)) んで、:E2v を実行すると、次のようになる。 \(\d\{1,3}\)\%(\(\d\d\d\)\+\($\|\D\)\)\@= (2) :M コマンド > :M/.+?<\/Items>/Im < :normal! /\C\_.\{-1,}<\/Items> (3) :S コマンド > :'<,'>S/(\d{1,3})(?=(\d\d\d)+($|\D))/\1,/g < :'<,'>s/\(\d\{1,3}\)\%(\(\d\d\d\)\+\($\|\D\)\)\@=/\1,/g 1 --> 1 12 --> 12 123 --> 123 1234 --> 1,234 12345 --> 12,345 123456 --> 123,456 1234567 --> 1,234,567 12345678 --> 12,345,678 123456789 --> 123,456,789 (4) :G コマンド > :G/^begin$/+1;/^end$/-1:S/\l+/\U&/g < :g/^begin$/+1;/^end$/-1:s/\l\+/\U&/g begin hello world. hello world wide web. hello The Internet. end |begin | HELLO WORLD. | HELLO WORLD WIDE WEB. | HELLO THE INTERNET. |end (5) :V コマンド 説明省略。 ============================================================================== 6. キーマップ *eregex-keymappings* / で行なう通常の検索と :M/ を入れ替える。 .vimrc に以下を書く。 ( MS-Windows の場合 _vimrc か _gvimrc ) nnoremap / :M/ nnoremap ,/ / "/" で、:M/ になり、",/" で従来の "/" が使えます。 -------------------- ~/.vimrc の中に、 let eregex_replacement=3 を書いておくと :S コマンドの動作が次のように変わります。 :S/pattern/\r,\n,\&,&,\~,~/ :s/pattern/\n,\r,&,\&,~,\~/ +--------------------+-----------------------------+ | eregex_replacement | :S/pattern/\n,\r,&,\&,~,\~/ | +--------------------+-----------------------------+ | 0 | :s/pattern/\n,\r,&,\&,~,\~/ | | 1 | :s/pattern/\r,\n,&,\&,~,\~/ | | 2 | :s/pattern/\n,\r,\&,&,\~,~/ | | 3 | :s/pattern/\r,\n,\&,&,\~,~/ | +--------------------+-----------------------------+ ============================================================================== 7. 原則 *eregex-principle* eregex.vim において、 「選択」「繰り返し」「丸カッコ」は、拡張正規表現流 を採用する。 それ以外は Vim の正規表現に従う。 ============================================================================== 8. 内部的な変換を表す一覧 *eregex-table* 左には拡張正規表現を書き、右には Vim 流正規表現('magic')を書く。 選択 -------------------- :M/a|b /a\|b 繰り返し -------------------- :M/a* /a* :M/a+ /a\+ :M/a? /a\= :M/a*? /a\{-} :M/a+? /a\{-1,} :M/a?? /a\{-,1} :M/a{3,5} /a\{3,5} :M/a{3,} /a\{3,} :M/a{,5} /a\{,5} :M/a{3,5}? /a\{-3,5} :M/a{3,}? /a\{-3,} :M/a{,5}? /a\{-,5} 丸カッコ(パレン) -------------------- :M/(abc) /\(abc\) :M/(?:abc) /\%(abc\) :M/(?<=abc) /\%(abc\)\@<= :M/(?abc) /\%(abc\)\@> 文字そのもの -------------------- :M/\\,\|,\(,\),\{,\},\?,\+,\*,\[,\] /\\,|,(,),{,},?,+,\*,\[,\] :M/\^,\$ /\^,\$ 拡張正規表現で使えないもの -------------------- \A, \b, \B, \G, \Z, \z これらは全て Vim のものとして扱われる。 (?i:a) や (?-i) なども使えない。 Vim の正規表現で使えないもの -------------------- \%(re\) 等、パレン(丸カッコ) を使うもの全般。 ~ matches the last given substitute string \m 'magic' on for the following chars in the pattern \M 'magic' off for the following chars in the pattern \v the following chars in the pattern are "very magic" \V the following chars in the pattern are "very nomagic" \x hex digit: [0-9A-Fa-f] \\x[0-9A-Fa-f]{1,2} の場合、文字そのものに変換する。 \x82\xa0 => 'あ' ( shift-jis, cp932 ) ただし、0x00 と 0x0a と 0x08 は変換しません。 Vim の正規表現で使えるもの -------------------- 大抵使えます。(^^;) \d, \D, \w, \W, \s, \S, \a, \A, \u, \U, \b, ... \<, \>, \zs, \ze \_[a-z], \%[abc], [[:alpha:]], \_., \_^, \_$ \%23l, \%23c, \%23v, \%# など。 ============================================================================== 9. 特殊なオプションとアトム *eregex-options* Note: "^L" は \x0c eregex.vim Vim --------------------------------------- :M/a/i /\ca/ :M/\ca/ /\ca/ :M/a/I /\Ca/ :M/\Ca/ /\Ca/ :M/\s/S /[ \t\r\n^L] :M/\S/S /[^ \t\r^L] :M/[^az]/C /\_[^az]/ :M/\W/C /\_W/ :M/./D /\_./ :M/\s[^az]./M /[ \t\r\n^L]\_[^az]./ :M/\s[^az].\M/ 同上。 :M/\s[^az]./m /[ \t\r\n^L]\_[^az]\_./ :M/\s[^az].\m/ 同上。 +--------+------+--------------------------------------------------------+ | OPTION | ATOM | 説明 | +--------+------+--------------------------------------------------------+ | /i | \c | 大小文字の区別無し。 | | /I | \C | 大小文字の区別あり。 | +--------+------+--------------------------------------------------------+ | /S | | \s および \S を [ \t\r\n^L] や [^ \t\r^L] に変換する。 | | /C | | 補集合が改行にもマッチする。 | | /D | | ドットが改行にもマッチする。 | +--------+------+--------------------------------------------------------+ | /M | \M | /S と /C を行なう。 部分マルチライン。 | | /m | \m | /S と /C と /D を行なう。完全マルチライン。 | +--------+------+--------------------------------------------------------+ Note: (A) オプション /iImM (B) \c, \C, \m, \M (C) (?i), (?I), (?m), (?M) これらが同時に指定された場合、上の方が優先順位が高い。 ちなみに、(?M) と (?m) は、ブラケットの中の \s には適用されません。 ============================================================================== 10. マルチライン *eregex-multiline* とりあえず以下の表を見て。(^^;) +-----+----------------------------------------------+--------------------+ | Num | eregex.vim => vim regex | ruby regex | +-----+----------------------------------------------+--------------------+ | (1) | :M/a\s[^az].z/ => /a\s[^az].z/ | /a[ \t][^az\n].z/ | +-----+----------------------------------------------+--------------------+ | | :M/a\s[^az].z/S => /a[ \t\r\n^L][^az].z/ | /a\s[^az\n].z/ | | | :M/a\s[^az].z/C => /a\s\_[^az].z/ | /a[ \t][^az].z/ | | | :M/a\s[^az].z/D => /a\s[^az]\_.z/ | /a[ \t][^az\n].z/m | +-----+----------------------------------------------+--------------------+ | (2) | :M/a\s[^az].z/M => /a[ \t\r\n^L]\_[^az].z/ | /a\s[^az].z/ | | (3) | :M/a\s[^az].z/m => /a[ \t\r\n^L]\_[^az]\_.z/ | /a\s[^az].z/m | +-----+----------------------------------------------+--------------------+ (1) は、「文字クラス」が Vim 流。 (2) は、「文字クラス」が Ruby 流。 Vim 流に言えば、改行にマッチする所が増えたので、部分マルチライン。 Ruby 流に言えば、マルチラインでない。よってオプションは大文字の M 。 (3) は、いわゆる Ruby 流のマルチライン。 Note: Vim の正規表現では、/[^az]/ は改行にマッチしません。 改行にマッチしないことを明示して /[^az\n]/ と書く必要はありません。 /[^az\n]/ は意図に反して改行にもマッチします。 よって、本来 /[^ \t\r\n^L]/ とするべきところを、/[^ \t\r^L]/ に 変換している場合があります。 原則的に Vim では、[^...] の中に \n を書いてはいけません。 ============================================================================== 11. デリミタの制限 *eregex-limitation-of-delimiter* :M で使える区切り文字は / と ? だけです。 :S 、:G および :V で使える区切り文字は /, #, @ です。 これらの使用方法は :s 、:g 、:v と同じです。 制限も同様です。 区切り文字を @ にするといろいろ制限があります。 一見うまくいきそうに見えてダメな例。 "foo@bar.baz.co.jp" を "foo@hoge.co.jp" に置換しようとして、 > :%s@\@foo\@hoge.co.jp@Ig < は、エラーです。 Vim の正規表現で、\@ は特別な扱いを受けています。 ============================================================================== 12. Vim の正規表現について *eregex-about-vimregex* 以下 カーソルを "111,222,333" の行に置いて、:S... を実行してください。 (1)通常のサブマッチ。 111,222,333 > :S/(\d+),(\d+),(\d+)/\=submatch(1) + submatch(2) + submatch(3) < 666 (2)Vim 独自機能。 マッチデータ($&, &, matchdata) と、サブマッチを分離できます。 \zs と \ze を使う。 See :h /\zs 111,222,333 > :S/(\d+),\zs\d+\ze,(\d+)/\=submatch(1) + submatch(0) + submatch(2) < 111,666,333 (3) 以下の方が分かりやすいかも。 111,222,333 > :S/(\d+),\zs(\d+)\ze,(\d+)/\=submatch(1) + submatch(2) + submatch(3) < 111,666,333 \zs と \ze を使うと、マッチデータに含まれないサブマッチを操作できます。 (4) \_x の機能。 \u で [A-Z] を表す。 \_u で [A-Z\n] を表す。 \_[A-Z] は [A-Z\n] と同じ。 大文字以外で改行を含む文字。 \_U == \_[^A-Z] \_. は改行を含む任意の文字。 (5) ^ と \_^ および $ と \_$ の違い。 $ を例にとります。 通常 $ は (1)正規表現の一番最後。 (2) ) の直前。 (3) | の直前。 にある場合だけ行末を表す。 ところが任意の場所で行末を表せるのが \_$ 。 111,222,333 > :S/(\d+),(\d+),(\d+)\zs\_$\ze/\=',' . (submatch(1) + submatch(2) + submatch(3)) < 111,222,333,666 ここで使っている \_$ の代わりに $ を使っても意図した結果になりません。 Note: \_^ と \_$ は perl の /m オプションとは全然違います。 ============================================================================== 13. 履歴 revision 2.55 (1) E2v() にバージョン番号や、sub-replace-special の置換を加えた。 (2) \v を 0x0b に置換するようにした。 (3) :M/pattern/ でマッチしなくても、@/ を更新した。 revision 2.35 (1) オプション S,C,D,M,m の追加と変更。 revision 1.4x (1) :S/\x2f/\\/g とかすると、:s///\\/g に変換してしまうバグ修正。 (2) エスケープされたデリミタを検索履歴ではアンエスケープした。 デリミタが '@' の場合を除く。 (3) オプション m の修正。 revision 1.13 :G で ! を使えるようにした。 revision 1.1.1.21 :S の /c オプションで確認のプロンプトが見えなくなってしまう問題修正。 -- vim:ft=help: