【问题标题】:Is it possible to use find and replace on a wildcard string in VIM?是否可以在 VIM 中对通配符字符串使用查找和替换?
【发布时间】:2012-04-26 15:30:11
【问题描述】:

例如,我有一堆具有共同前缀和后缀的值,例如:

fooVal1Bar;

fooVal2Bar;

fooVal3Bar;

在这种情况下,所有变量名都以foo 开头和结尾,并以Bar 结尾。我想使用在fooBar 之间找到的随机变量名称进行查找和替换。假设我已经定义了变量Val1Val2Val3Val1OldVal2OldVal3Old。我会做一个替换,类似于:

:%s/foo<AnyString>Bar/foo<AnyString>Bar = <AnyString> + <AnyString>Old

这将导致:

fooVal1Bar = Val1 + Val1Old;

fooVal2Bar = Val2 + Val2Old;

fooVal3Bar = Val3 + Val3Old;

我希望很清楚我想要做什么,我在 vim 帮助或网上找不到任何关于用通配符字符串替换的内容。我能找到的最多的是搜索通配符字符串。

【问题讨论】:

    标签: vim wildcard replace


    【解决方案1】:

    我相信你想要

    :%s/foo\(\w\+\)Bar/& = \1 + \1\Old/
    

    解释:

    \w\+ 找到一个或多个出现的字符。前面的 foo 和后面的 Bar 确保这些匹配的字符正好在 fooBar 之间。

    \(...\) 存储此字符,以便它们可以用于替换的替换部分。

    &amp; 复制匹配的内容

    \1\(....\) 部分中捕获的字符串。

    【讨论】:

    • \w\+和.*有区别吗?
    • \w\+ 匹配此集合中的一个或多个:a-zA-Z0-9_ 和 .* 匹配零个或多个任何内容。
    • 嗯,好的。这就说得通了。谢谢!
    • 刚刚在我想搜索和替换的代码上试了一下,效果很好。再次感谢!
    • 如果要匹配固定的出现次数,可以使用\w\{n,m}\w\{,m} 匹配最大出现次数
    【解决方案2】:

    您需要捕获要保存的内容。试试这样的:

    %s/\(foo\(\w\+\)Bar\);/\1 = \2 \2Old/
    

    或者你可以用magic清理一下:

    %s/\v(foo(\w+)Bar);/\1 = \2 \2Old/
    

    【讨论】:

      【解决方案3】:

      用通配符替换字符串

      :%s/foo.*Bar/hello_world/gc
      

      在这里,.* 处理通配符遵循正则表达式,更多信息请参见 regex quantifiers

      . - Any character except line break
      * - Zero or more times
      

      【讨论】:

        猜你喜欢
        • 2023-04-04
        • 2013-11-28
        • 2018-10-24
        • 1970-01-01
        • 2018-05-12
        • 2016-04-09
        • 1970-01-01
        • 1970-01-01
        • 2021-09-25
        相关资源
        最近更新 更多