开发者

Help with back reference regex in Vim

I am trying to write a regular expression in vi to match any whitespace character followed by any digit. Then, at each match, insert a dollar sign between the whitespace and the digit. Here is an example:

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

The correct regex would produce开发者_如何学Go this:

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

I realize I need to use a back reference, but I can't quite seem to write the correct regex. Here is my attempt:

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

Also, I have Vim's default regex mode turned off (vnoremap / /\v).

Thanks for the help.


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


Using a back reference is not inevitable. One can make a pattern to match zero-width text between a whitespace character and a digit, and replace that empty interval with $ sign.

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

(See :help /\zs and :help /\ze for details about the atoms changing the borders of a match.)


My first thought is:

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

with \b is for word boundary. But it turns out that \b doesn't mean word boundary in Vim regex, rather \< and \> for the start and end of the word. So the right answer would be:

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

(Making sure to escape the capturing parenthesis.)

Sorry that my correction came so late.


Not sure abt the exact vim syntax, but regEx syntax should be this:

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

so something like:

/(\s)([\d])/\1 $\2/g


This will do the job for you (without using groups):

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

Explanation:

  • %: On every line...
  • s: Substitute...
  • /: Start of pattern
  • \s: Whitespace
  • \@<=: Match behind (zero-width)
  • \d: Digit
  • \@=: Require match (zero-width)
  • /: End of pattern, start of replacement
  • $: What you asked for!
  • /: End of replacement
  • g: Replace all occurrences in the line.
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜