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

drb*_*sen 2 regex vim backreference

我试图在vi中编写一个正则表达式来匹配任何空格字符后跟任何数字.然后,在每次匹配时,在空格和数字之间插入一个美元符号.这是一个例子:

A1234 12 14 B1234
B1256 A2 14 C1245
C1234 34 D1 1234K
Run Code Online (Sandbox Code Playgroud)

正确的正则表达式会产生这个:

A1234 $12 $14 B1234
B1256 A2 14 C1245
C1234 $34 D1 $1234K
Run Code Online (Sandbox Code Playgroud)

我意识到我需要使用后向引用,但我似乎无法编写正确的正则表达式.这是我的尝试:

:'<,'>/(\s\d)/\s\1\$/g
Run Code Online (Sandbox Code Playgroud)

此外,我关闭了Vim的默认正则表达式模式(vnoremap / /\v).

谢谢您的帮助.

Jee*_*tra 9

你需要转义括号,使它们作为分组而不是文本中的实际匹配,而不是逃避$.像这样:

:%s/\(\s\)\(\d\)/\1$\2/g
Run Code Online (Sandbox Code Playgroud)

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

编辑:刚刚意识到你的非标准正则表达式设置会让你逃脱"反过来".但是,我认为,诀窍是使用两组.使用您的设置,这应该工作:

:%s/(\s)(\d)/\1$\2/g
Run Code Online (Sandbox Code Playgroud)


ib.*_*ib. 5

使用反向引用并非不可避免.可以创建一个模式来匹配空白字符和数字之间的零宽度文本,并用$符号替换该空间隔.

:'<,'>s/\s\zs\ze\d/$/g
Run Code Online (Sandbox Code Playgroud)

(请参阅:help /\zs:help /\ze有关原子改变匹配的边界的信息.)