1

いくつかのブランチを使用して検索し、一致するブランチからサブマッチを取得して置換に使用したいと考えています。

この特定の質問については、「=」または「-」(小さいサブセット) 内の 1 文字で完全に構成され、その文字が少なくとも 3 文字あり、それぞれのスペースに関する条件が異なる行を取得したいと考えています。

したがって、次の式を使用してそれらを一致させます。

^\t\(=\)\{3,}\_$\|[ ]\{5,}^\(-\)\{3,}\_$

次にやりたいことは、サブマッチを代用で使用することです。私はこれを行うことができると思いました:

:.s/^\t\(=\)\{3,}\_$\|[ ]\{5,}^\(-\)\{3,}\_$/apple\1banana/e

ただし、2 番目のブランチではなく、最初のブランチ (「=」を含む) が一致した場合にのみ機能するようです。どうすればこれを機能させることができますか?20 のブランチを使用しても、一致するブランチからサブマッチを取得できるソリューションを探しています。

4

2 に答える 2

2

私が見たところ、グループは必要ありません。これはあなたのコマンドと同じように機能するようです(テストするサンプルはありません):

:.s/^\t\zs=\ze=\{2,}$\|^[ ]\{5,}\zs-\ze-\{2,}$/apple&banana/e

これにより、すべての [-=] が置き換えられます。

:.s/^\t\zs=\{3,}$\|^[ ]\{5,}\zs-\{3,}$/apple&banana/e

編集が必要なテキストのサンプルと期待される結果を共有できれば、私が書いたものが機能するかどうかをテストしやすくなります.

于 2012-05-23T21:57:16.243 に答える
1

幅ゼロのパターンと後方参照を使用してこれを行うことができます。

\(\%(^\t\)\@<==\{3}\|\%([ ]\{5,}^\)\@<=-\{3}\)\_$

ゼロ幅パターンを使用すると、パターンを一部の文字の一致から位置の一致に変換できます。 \@<=直前のパターンが現在の位置の直前に発生することを示しています。

\zs\%(...\)\@<=toで始まる任意のパターンを簡略化できる特殊なケースです...\zs

もう 1 つのアプローチは、置換ですべての後方参照を使用することです。一致しないブランチからの後方参照は、空の文字列に展開されます。

:.s/^\t\(=\)\{3,}\_$\|[ ]\{5,}^\(-\)\{3,}\_$/apple\1\2banana/e
于 2012-05-23T22:03:10.093 に答える