2

私はVimを使用していますが、次のコードがあります。

print "Number 1 = $no1\n";
print "Number 2 = $no2\n";

次の代替コマンドを適用すると

$s/.*\(\d\\n\)\@<=\(";\)/\1

結果は

1\n
2\n

代わりに後方参照\2に置き換えると

$s/.*\(\d\\n\)\@<=\(";\)/\2

結果は

";
";

正規表現には1つの後方参照しかないと思いました( ";)\ 1に格納されたのは、ゼロ幅のポジティブルックビハインド内で使用した正規表現のようです。これは後方参照には格納されないと思いました。

私は間違っていますか?

4

2 に答える 2

2

\(は常にキャプチャバックリファレンスだと思います。いくつかの試みから私が見ることができることから、あなたが望むのは、\%(キャプチャされていないバックリファレンスであるです。

したがって、基本的に、代替を次のように書き直します。

$s/.*\%(\d\\n\)\@<=\(";\)/\1

置く

";

\1ではなく、後方参照する\2

于 2013-02-26T02:56:24.807 に答える
0

次の代替コマンドを適用する場合:

:%s/.*\(\d\\n\)\@<=\(";\)/\1

...結果は次のとおりです。

1\n
2\n

当然のことながら、\1キャプチャグループで次の式をキャプチャしたためです。

\(\d\\n\)

\2...そして代わりに後方参照で置き換える場合

:%s/.*\(\d\\n\)\@<=\(";\)/\2

...結果は次のとおりです。

";
";

当然のことながら、2番目のキャプチャグループで次の式をキャプチャしたためです。

\(";\)

あなたが何をしようとしているのかわかりません。上記の置換からどのような出力を期待していましたか?

于 2013-02-26T02:55:58.920 に答える