替换部分正则表达式匹配

时间:2013-06-08 04:40:24

标签: vim vi

我的代码中有几个以get_开头的函数:    get_num(...)get_str(...)

我想将它们更改为get_*_struct(...)

我可以以某种方式匹配get_*正则表达式,然后根据模式进行替换,以便:

get_num(...)变为get_num_struct(...)get_str(...)变为get_str_struct(...)

你能否解释一下它背后的一些逻辑,因为理论正则表达式与UNIX(或vi中使用的正则表达式不同,它们是不同的吗?)而且我总是在努力想象他们出去了。

这必须在vi编辑器中完成,因为这是主要的工作工具。

谢谢!

2 个答案:

答案 0 :(得分:3)

要将get_num(...)转换为get_num_struct(...),您需要在输入中捕获正确的文本。并且,您不能将括号放在正则表达式中,因为您可能需要匹配函数的指针,如&get_distance中所示,并在注释中使用。但是,这部分取决于你使用vim的部分原因以及你需要将整个输入保持在一起的部分原因,我已经检查过这是否有效:

%s/get_\w\+/&_struct/g

在每一行上,找到以get_开头并继续至少一个字母,数字或下划线的每个表达式,并将其替换为整个匹配的字符串,后跟_struct。

认真地说;我不应该按规格回答这些问题。请注意,其他正则表达式引擎可能会使用\&而不是&amp ;.这取决于魔法集,这在vim中是默认的。

答案 1 :(得分:1)

另一种方法:

%s/get_\(\w*\)(/get_\1_struct(/g

这是做什么的:

  • \w匹配任何“单词字符”; \w*匹配0个或更多单词字符。
  • \(...\)告诉vim记住任何匹配...。因此,\(w*\)表示“匹配任意数量的字符,并记住您匹配的内容。然后您可以使用\1(或\2替换第二个等)来访问它。
  • 因此,整体模式get_\(\w*\)(会查找get_,后跟任意数量的字词,然后是(
  • 然后替换就完全按照你的意愿行事。

(对不起,如果那太冗长了 - 不确定你对vim正则表达式有多放心。)