繁体   English   中英

Vim 正则表达式反向引用

[英]Vim regex backreference

我想做这个:

%s/shop_(*)/shop_\1 wp_\1/

为什么shop_(*)匹配任何东西?

这里有几个问题。

  1. vim regexen 中的括号不用于捕获 - 您需要使用\\( \\)进行捕获。

  2. *并不代表你的想法。 它的意思是“前一个的 0 个或多个”,所以你的正则表达式的意思是“一个包含shop_后跟 0+ (然后是一个文字)的字符串。
    您正在寻找. , 在正则表达式中的意思是“任何字符”。 与星号放在一起作为.*表示“0 个或多个任意字符”。 您可能需要至少一个字符,因此请使用.\\++表示“前一个或多个”)

使用这个: %s/shop_\\(.\\+\\)/shop_\\1 wp_\\1/

可选择在最后一个斜杠后以g结尾,以替换一行上的所有实例,而不仅仅是第一个。

如果我理解正确,你想要%s/shop_\\(.*\\)/shop_\\1 wp_\\1/

转义捕获括号并使用.*匹配任意数量的任意字符。

(您的搜索正在搜索“shop_”,后跟任意数量的左括号,后跟右括号)

如果您想避免转义捕获括号并使正则表达式模式语法更接近其他实现(例如 PCRE),请在模式开头添加\\v (非常神奇!)(有关更多信息,请参阅:help \\magic ):

:%s/\vshop_(*)/shop_\1 wp_\1/

@Luc 如果你看这里: regex-info ,你会看到 vim 的行为是正确的。 这是来自 sed 的平行:

echo "123abc456" | sed 's#^([0-9]*)([abc]*)([456]*)#\3\2\1#'
sed: -e expression #1, char 35: invalid reference \3 on 's' command's RHS

而使用“转义”括号,它可以工作:

echo "123abc456" | sed 's#^\([0-9]*\)\([abc]*\)\([456]*\)#\3\2\1#'
456abc123

我讨厌看到 vim 受到诽谤——尤其是当它表现得正确时。

PS我试图将其添加为评论,但无法正确设置格式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM