17

今日、行の最初の複数のスペースだけで表を揃える必要がありました。

<ScrollWheelDown>    move window     three lines     down  
<S-ScrollWheelDown>     move window    one page   down
<ScrollWheelUp>        move window      three lines up
<S-ScrollWheelUp>    move window   one page      up

Tabular プラグインを使用してテーブルを整列させていますが、複数のスペースの最初の出現のみを見つけて、そこでのみ整列を行う方法を見つけることができませんでした。

私はVIMでもそれを知りません:行で3番目に出現するパターンを見つけたいだけの場合、正規表現は何になりますか? 正規表現は表形式を使用するのと同じですか?

4

4 に答える 4

19

正規表現は次のようになります。

/\(.\{-}\zsPATTERN\)\{3}

たとえば、次の行の 3 番目の 'foo' を 'bar' に変更したい場合:

lorem ifoopsum foo lor foor ipsum foo dolor foo
       ^1      ^2      ^3         ^4        ^5

走る:

s/\(.\{-}\zsfoo\)\{3}/bar/

取得するため:

lorem ifoopsum foo lor barr ipsum foo dolor foo
       ^1      ^2      ^3=bar     ^4        ^5
于 2011-03-24T19:57:48.500 に答える
5

それがあなたのニーズに合っているかどうかはわかりませんが、その方法で検索できます:

  1. カーソルを最初の行に置きます
  2. タイプ3 / pattern Return

次の一致する行の 3 番目の出現にカーソルを置きます (すべての出現を強調表示します)。

マクロもできます:

qa+3nq

次に@a、次の行に移動します

于 2011-03-24T17:36:06.857 に答える
4

「正規表現n番目の出現」だけを検索するGoogleユーザー(私のような)の場合。これは、3 番目の 'foo' の最後の文字の位置を返します (あなたとあなたのテキストに変更する必要があり{3}ますn) foo:

length(regexp_replace('lorem ifoopsum foo lor foor1 ipsum foo dolor foo', '((?:.*?foo){3}).*$', '\1'))

これ: (?:.*?foo)'foo' が後に続くものを検索し、それを 3 回繰り返し(?:.*?foo){3}ます。次に、最初から 3 回目の繰り返しまでの文字列 (を含む) をキャプチャし、文字列の残りの部分を に一致させ.*$、文字列全体をキャプチャしたものに置き換えます。長さの 3 番目の 'foo' の最後の文字の位置です。

于 2015-05-02T08:07:50.480 に答える
1

これを試して:

:Tabularize /^.\{-}\S\s\{2,}

はい、TabularizeはVimの正規表現を使用しているため、Eelvexの回答の例は機能するはずです。

于 2011-03-24T20:33:06.710 に答える