0

これを解決する方法がわかりません:

test中括弧
peを使用してパターン pe ' ' を検索しようとしていますtest\{2,}

入力ダイアログを使用して同じパターンに追加または削除したい。

pe
単語をtest{2,} 回
見つけて、一致から 1 つのテストを削除するか、単語をtest{2,3} 回検索して、一致から 2 x テストを削除する
か、単語をtest{,2} 回見つけて、一致するテストを 2 つ追加します

やりたいことを行うための正規表現が見つかりません。
誰かが解決策を知っていますか?

編集
おそらく、リスト内のサブマッチ文字列を分割することが解決策であり、一致の数(リストの長さ)をカウントします。
pe 検索test\{2,5}と 2 x テストの削除:

%s/\(test\)\@<!\(test\)\{2,5}\(test\)\@!/\=repeat(submatch(2), len(split(submatch(2), 'test'))-2)/g

しかし、これは機能しません。私は何を間違えたのですか?

4

3 に答える 3

1

私は答えを見つけました。
一般的な正規表現でそれを行うことができます。

解決策は、検索文字列を分割し、一致する数を数え、一致する数がわかった後で、これらの一致から追加または削除できるようにすることでした。

正規表現:

%s/\(test\)\@<!\(test\)\{2,5}\(test\)\@!/\=repeat(submatch(2), len(split(submatch(0), '\ze'.submatch(2)))+2)/g

説明:

  • 2回から5回検索testしますが、それ以上の文字列は検索しませんtest:

    \(test\)\@<!\(test\)\{2,5}\(test\)\@!

  • test一致全体で何回見つかったかを調べます。

    len(split(submatch(0), '\ze'.submatch(2))

    一致全体を nr で分割します。単一の一致を数え、単一の一致を数えます

    submatch(0) = 複数の 'test' (全体一致)
    submatch(2) = 'test'

  • 番号を繰り返します。一致全体の中からの一致の数と、それに/からの追加または削除:

    \=repeat(submatch(2), len(split(submatch(0), '\ze'.submatch(2)))+2)

于 2013-08-03T07:58:37.527 に答える
1

あなたの要件を正しく理解していれば、答えが役立つかもしれません。

例で使用test(space)しますが、例には末尾のスペースがあります

  • テストという単語を {2,} 回見つけて、一致から 1 つのテストを削除します
[before ]test test foo test test test foo test 
[command]s/\v(test )(\1+)/\2/g
[after  ]test foo test test foo test 
  • 単語 test を {2,3} 回見つけて、一致から 2 x test を削除します
[before ]test test foo test test test foo test 
[command]s/\v(test ){2}(\1?)/\2/g
[after  ]foo test foo test 
  • 単語 test を {,2} 回検索し、一致するように 2 x test を追加します
[before ]test test foo test test test foo test 
[command]s/\v(test ){,2}/&\1\1/g
[after  ]test test test test foo test test test test test test test foo test test test 
于 2013-08-02T13:47:30.293 に答える