我在多个地方的代码中有以下字符串,
m_cells->a[ Id ]
我想用
c(Id)
字符串Id
可以是任何东西,包括数字。
@BasBossink 的答案的完整解释(作为单独的答案,因为这不适合评论),因为正则表达式很棒但不平凡,绝对值得学习:
在命令模式下(即:
从普通模式输入),s/search_term/replacement/
将替换在当前行第一次出现“search_term”和“replacement” 。之前的
告诉vim 对文档中的所有行执行操作。任何范围规范在这里都是有效的,例如。对于第 5-10 行。
最后一个执行“全局”操作 - 一行或多行上所有出现的“search_term”,而不仅仅是第一次出现。%
s
5,10
g
/
搜索词的“m_cells->a”部分是文字匹配。然后它变得有趣。
许多字符在正则表达式中具有特殊含义,如果您想按字面意思使用该字符,而没有特殊含义,那么您必须通过\
在前面加上 a 来“转义”它。
因此\[
并\]
匹配文字 '[' 和 ']' 字符。
然后我们有相反的情况:我们希望将文字字符视为特殊的正则表达式实体。
\s
匹配 white*s*pace(空格、制表符等)。
\w
匹配 "*w*ord" 字符(字母、数字和下划线_
)。
(.
匹配任何字符(换行符除外)。\d
匹配数字。还有更多...)
如果字符后面没有量词,一个这样的字符匹配。因此,\s
将匹配一个空格或制表符,但不会更少或更多。
\+
是一个量词,意思是“一个或多个”。(\?
匹配 0 或 1;*
(没有反斜杠)匹配任何数字:零或多个。警告:匹配零次需要一点时间来适应;当您第一次学习正则表达式时,您并不总是得到预期的结果. 也可以匹配任意准确的出现次数或范围,但我不会在这里讨论。)
\(
和\)
齐心协力,组成“抓捕团”。这意味着我们不只是想匹配这些字符,我们还想特别记住它们,以便我们以后可以对它们做一些事情。您可以拥有任意数量的捕获组,它们也可以嵌套。您可以稍后按编号引用它们,从1(而不是 0)开始。只需从左侧开始计算(转义)左括号以确定数字。
所以在这里,我们匹配一个空格,然后是一组(我们将捕获)至少一个“单词”字符后跟一个空格,在方括号内。
然后第二和第三之间的部分/
是替换文本。
“c”是字面意思。
\1
表示第一个捕获的组,在这种情况下将是“Id”。
总之,我们正在寻找与给定描述匹配的文本,捕获其中的一部分,并用我们构建的替换文本替换整个匹配。
也许是最后的建议:c
在final之后/
(不管它是在'g'之前还是之后)启用*c*onfirmation:vim将突出显示要替换的字符并显示替换文本并询问您是否要前进。非常适合学习。
是的,正则表达式很复杂,但是超级强大,非常值得学习。一旦你把它们内化了,它们实际上是相当容易的。我建议,就像学习 vim 本身一样,你从基础开始,熟练掌握它们,然后逐渐将新功能添加到你的曲目中。
祝好运并玩得开心点。