在Vim中帮助反向引用正则表达式

时间:2011-09-22 23:27:45

标签: regex vim backreference

我正在尝试在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)。

感谢您的帮助。

5 个答案:

答案 0 :(得分:8)

您需要转义括号以使它们作为分组而不是文本中的实际匹配,并且转义$。像这样:

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

这对我在vim中起作用(使用标准魔术设置)。

编辑:刚刚意识到您的非标准正则表达式设置会导致您“逃避”。但是,我认为,诀窍是使用两组。使用您的设置,这应该有效:

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

答案 1 :(得分:5)

使用反向引用并非不可避免。人们可以制作匹配的模式 空白字符和数字之间的零宽度文本,并替换它 $符号的空间隔。

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

(有关更改原子的详细信息,请参阅:help /\zs:help /\ze 比赛的边界。)

答案 2 :(得分:1)

我的第一个想法是:

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

用于字边界。但事实证明,\b并不意味着Vim正则表达式中的单词边界,而是\<\>表示单词的开头和结尾。所以正确的答案是:

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

(确保逃避捕获括号。)

很抱歉,我的纠正来得太晚了。

答案 3 :(得分:0)

不确定vim的确切语法,但regEx语法应为:

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

如下所示:

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

答案 4 :(得分:0)

这将为您完成工作(不使用组):

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

说明:

  • %:在每一行......
  • s:替代......
  • /:模式开始
  • \s:空白
  • \@<=:匹配(零宽度)
  • \d:数字
  • \@=:需要匹配(零宽度)
  • /:模式结束,替换开始
  • $:你要的是什么!
  • /:替换完毕
  • g:替换该行中的所有匹配项。