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