2

次のようなテキストがあります。

prefix:hello1_Th2ere_a3nd_Ther4e

これらのテキストを次のように変更します。

prefix:Hello1Th2ereA3ndTher4e

そして、次のコマンドを実行しようとしています:

:1,$s/prefix:\(\([a-z]\)\([a-zA-Z0-9]\+\)_\)\+\([a-z]\)\([a-zA-Z0-9]\+\)/???

次に、「???」を埋める方法がわかりません

引用符がネストされていない場合は、「\1\2」で正規表現の引用符内のコンテンツを参照できますが、引用符がネストされている場合はどうすればよいですか。

4

3 に答える 3

2

これは通常、ネストされた 2 つの代替によって行われます。

%s/\v(prefix\:)@<=%([a-zA-Z]%([a-zA-Z0-9]+)_)+[a-zA-Z][a-zA-Z0-9]+/\=substitute(substitute(submatch(0), '\v[^_]+', '\u\0', 'g'), '_', '', 'g')/

正規表現が例の文字列と一致しないことに注意してください。「Th2ere」と「Ther4e」の「T」は一致しない[a-z]ため、に置き換えました[a-zA-Z]

于 2012-10-14T09:26:43.090 に答える
1

ネストされた一致は、左中括弧を数えて\1、 、 などと数えられます。\2適用されない内部一致は単に空です。

ヒント: 不必要なキャプチャ グループを回避する\%(...\)には、キャプチャする必要のない部分に を使用します。Perl のような Regexp エンジンでは、名前付きキャプチャが許可されているため、より理解しやすくなっていますが、Vim はこれをサポートしていません。

于 2012-10-14T15:52:10.743 に答える