1

我的代码中有几个以开头的函数get_get_num(...),get_str(...)

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

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

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

您还可以解释一下它背后的一些逻辑吗,因为理论上的正则表达式不像UNIX(或者vi,它们不同吗?)中使用的那些,而且我一直在努力弄清楚它们。

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

谢谢!

4

2 回答 2

3

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

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

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

该死的;我不应该按规范回答这些问题。请注意,其他正则表达式引擎可能使用 \& 而不是 &。这取决于是否有魔法设置,这是 vim 中的默认设置。

于 2013-06-08T04:50:47.510 回答
1

对于另一种方法:

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

这是做什么的:

  • \w匹配任何“单词字符”;\w*匹配 0 个或多个单词字符。
  • \(...\)告诉 vim 记住任何匹配项...。因此,\(w*\)意味着“匹配任意数量的单词字符,并记住您匹配的内容。然后您可以在替换中访问它\1(或\2第二个等)
  • 因此,整体模式get_\(\w*\)(查找get_,后跟任意数量的单词字符,然后是(.
  • 然后,替换正是您想要的。

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

于 2013-06-09T21:26:20.523 回答