web-dev-qa-db-ja.com

行のパターンの3番目の出現を見つける方法

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

pE.

<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

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

VIMでもそれがわかりません。行のパターンの3番目のオカレンスのみを検索したい場合、正規表現はどうなりますか?正規表現は表形式を使用するのと同じですか?

17
Reman

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

/\(.\{-}\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
17
Eelvex

Googleのユーザー(私のような)の場合、「regex nthオカレンス」のみを検索します。これは、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」の最後の文字の位置になります。

4
alexkovelsky

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

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

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

マクロすることもできます:

qa+3nq

その後 @a 次の行に移動します

4
M'vy

これを試して:

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

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

1
Raimondi