我正在尝试在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
)。
感谢您的帮助。
答案 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)