【问题标题】:Regular expression in vimvim中的正则表达式
【发布时间】:2009-07-29 08:55:29
【问题描述】:

如何在 vim 中将字符串 (4000 到 4200 ) 替换为 (5000 到 5200) ..

【问题讨论】:

    标签: vim


    【解决方案1】:

    另一种可能性:

    :%s/\v<4([01]\d{2}|200)>/5\1/g
    

    这个也是200个,因为用了\v switch,所以不会太受“倾斜牙签综合症”的困扰。

    编辑 #1:添加了单词边界锚('&lt;''&gt;')以防止替换 "14100" 等。


    编辑#2:在某些情况下,“单词边界”不足以正确捕获所需的模式。如果您希望空白作为分隔因素,则表达式会变得更加复杂。

    :%s/\v(^|\s)@<=4([01]\d{2}|200)(\s|$)@=/5\1/g
    

    其中 "(^|\s)@&lt;=" 是 "start-of-line" 或 "\s" 的后向断言,而 "(\s|$)@=" 是 "end-of-line" 或 " \s"。

    【讨论】:

    • 我认为这是最干净的方式,因为它隐式处理棘手的 4200 案例
    【解决方案2】:
    :%s/\<4\([01][0-9][0-9]\)\>/5\1/g
    

    【讨论】:

    • 有没有设置可以输入 :s//\5\1/g
    【解决方案3】:
    :%s/\<4\([0-1][0-9][0-9]\)\>/5\1/g
    

    将执行 4000 到 4199。然后您必须分别执行 4200/5200。

    快速解释。上面找到 4,后面跟着 0 或 1,后面跟着 0-9 两次。 0-1,0-9,0-9 被包装在一个组中,替换(在斜线后面)表示用 5 替换,然后是最后一个匹配的组(\1,即 4 之后的位)。

    \ 是单词边界,以防止与 14002 匹配(感谢 Adrian)

    % 表示跨所有行。 /g 表示该行中的每个匹配项(不仅仅是第一个匹配项)。

    【讨论】:

    • 你错过了\1,除非我弄错了。
    【解决方案4】:

    如果您出于某种原因不想进行完整搜索和替换,请记住ctrl-a 将增加光标下方或之后的下一个数字。因此,在命令模式下,您可以点击1000 ctrl-a 将下一个数字增加 1000。

    如果您使用的是 Windows,请参阅 this question 中有关如何使 ctrl-a 递增而不是全选的答案。

    【讨论】:

      【解决方案5】:

      更多的打字,但更少的思考:

      :%s/\d\+/\=submatch(0) >= 4000 && submatch(0) <= 4200 ? submatch(0) + 1000 : submatch(0)/g
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        • 1970-01-01
        • 2011-03-02
        • 2014-07-23
        相关资源
        最近更新 更多