2

viで正規表現を記述して、任意の空白文字とそれに続く任意の数字に一致させようとしています。次に、一致するたびに、空白と数字の間にドル記号を挿入します。次に例を示します。

A1234 12 14 B1234
B1256 A2 14 C1245
C1234 34 D1 1234K

正しい正規表現はこれを生成します:

A1234 $12 $14 B1234
B1256 A2 14 C1245
C1234 $34 D1 $1234K

バックリファレンスを使用する必要があることはわかっていますが、正しい正規表現を記述できないようです。これが私の試みです:

:'<,'>/(\s\d)/\s\1\$/g

また、Vimのデフォルトの正規表現モードをオフにしました(vnoremap / /\v)。

助けてくれてありがとう。

4

5 に答える 5

9

You need to escape the parentheses to make them work as groupings rather than as actual matches in the text, and not escape the $. Like so:

:%s/\(\s\)\(\d\)/\1$\2/g

This worked for me in vim (using standard magic setting).

Edit: just realized that your non-standard regex settings cause you having the escape 'the other way around'. But still, the trick, I think, is to use two groups. With your settings, this should work:

:%s/(\s)(\d)/\1$\2/g
于 2011-09-23T00:58:11.387 に答える
5

後方参照の使用は避けられません。空白文字と数字の間のゼロ幅のテキストに一致するパターンを作成し、その空の間隔を$記号に置き換えることができます。

:'<,'>s/\s\zs\ze\d/$/g

(マッチの境界を変更するアトムの詳細については、を参照:help /\zsしてください。):help /\ze

于 2011-09-23T01:31:55.157 に答える
1

私の最初の考えは:

:%s/(\b\d)/$\1/g

with\bは単語境界用です。しかし、それは\bVim正規表現の単語境界を意味するのではなく、\<単語\>の開始と終了を意味することがわかりました。したがって、正しい答えは次のようになります。

:%s/\(\<\d\)/$\1/g

(キャプチャー括弧を必ずエスケープしてください。)

私の訂正がとても遅くなってすみません。

于 2011-09-22T23:32:01.580 に答える
0

正確なvim構文についてはわかりませんが、regEx構文は次のようになります。

search expr - "(\s)([\d])"
replacement expr - "\1 $\2"

だから次のようなもの:

/(\s)([\d])/\1 $\2/g
于 2011-09-22T23:34:00.413 に答える
0

これはあなたのために仕事をします(グループを使用せずに):

:%s/\s\@<=\d\@=/$/g

説明:

  • %:すべての行で...
  • s: 代わりの...
  • /:パターンの開始
  • \s:空白
  • \@<=:後ろに一致(ゼロ幅)
  • \d:数字
  • \@=:一致が必要(ゼロ幅)
  • /:パターンの終わり、交換の開始
  • $:あなたが求めたもの!
  • /:交換終了
  • g:行内のすべてのオカレンスを置き換えます。
于 2011-09-23T01:24:49.290 に答える