【问题标题】:Regular expression search replace in Sublime Text 2Sublime Text 2中的正则表达式搜索替换
【发布时间】:2012-08-02 22:17:06
【问题描述】:

我希望在 Sublime Text 2 中用正则表达式进行搜索替换。documentation on this 相当贫乏。具体来说,我想对组进行替换,因此类似于转换此文本:

Hello my name is bob

还有这个搜索词:

查找内容:my name is (\w)+

替换为:my name used to be $(1)

搜索词可以正常工作,但我无法找到使用 regexp 组实际进行替换的方法。

【问题讨论】:

    标签: regex replace sublimetext2


    【解决方案1】:

    通常,对于第一个捕获组(括号中的模式的第一个匹配项),反向引用是 $1\1(反斜杠),实际上 Sublime 支持这两种语法。所以试试:

    my name used to be \1
    

    my name used to be $1
    

    还要注意您的原始捕获模式:

    my name is (\w)+
    

    不正确,只会捕获名称的最后一个字母,而不是整个名称。您应该使用以下模式来捕获名称的所有字母:

    my name is (\w+)
    

    【讨论】:

    • 否,$0 不用作正则表达式中的反向引用(因为\0 等于空字符,\0ddd 用作带有代码点 ddd 的字符的转义) .但是,根据this page$0 似乎在 Sublime2 中被用作“退出标记”(尽管我很难找到足够的示例来准确计算在 Sublime2 中如何使用退出标记)。
    • 退出标记 $0 在 Sublime Text 2/3 中用于将光标置于 sn-p 扩展的退出处。 More on snippets.
    • $0 仍然适用于在 Sublime Text 2 中反向引用整个表达式
    • $0 是整个正则表达式匹配; $1 是第一个捕获组。
    • $0 在 Sublime 3 中为我工作以获得整个匹配的表达式。我在整个正则表达式周围有一个捕获组,中间有一个嵌套捕获组,$1 引用了内部捕获组,这很奇怪,因为我认为捕获组是通过开括号来排序的。希望这对某人有帮助!
    【解决方案2】:

    顺便说一下,在上面的问题中:

    为:

    Hello, my name is bob
    

    查找零件:

    my name is (\w)+
    

    带替换部分:

    my name used to be \1
    

    会返回:

    Hello, my name used to be b
    

    将查找部分更改为:

    my name is (\w+)
    

    替换将是您所期望的:

    Hello, my name used to be bob
    

    虽然 (\w)+ 将匹配 "bob",但它不是您想要替换的分组。

    【讨论】:

      【解决方案3】:

      重要提示:在搜索字符串中使用 ( ) 括号

      虽然前面的答案是正确的,但有一点需要强调!您要在替换字符串中使用的所有搜索字符串中匹配的段必须( )括号括起来,否则这些匹配段将无法被定义的变量访问,例如 $1$2\1\2 等。

      例如,我们想将 'em' 替换为 'px' 但保留数字值:

          margin: 10em;  /* Expected: margin: 10px */
          margin: 2em;   /* Expected: margin: 2px */
      
      • 替换字符串:margin: $1pxmargin: \1px
      • 搜索字符串(正确):margin: ([0-9]*)em // 带括号
      • 搜索字符串(错误):margin: [0-9]*em

      正确案例示例:使用margin: ([0-9]*)em 搜索字符串(带括号)。用( )括号括住所需的匹配段(例如$1\1),如下所示:

      • 查找:margin: ([0-9]*)em(带括号)
      • 替换为:margin: $1pxmargin: \1px
      • 结果:
          margin: 10px;
          margin: 2px;
      

      不正确的案例示例: 使用 margin: [0-9]*em 搜索字符串(不带括号)。以下正则表达式模式将匹配所需的行,但匹配的段在替换字符串中将不可用,例如 $1\1 等变量:

      • 查找:margin: [0-9]*em(不带括号)
      • 替换为:margin: $1pxmargin: \1px
      • 结果:
          margin: px; /* `$1` is undefined */
          margin: px; /* `$1` is undefined */
      

      【讨论】:

      • 谢谢,这个答案确实指出了一个有趣的事实,解决了我的问题。
      • 感谢您指出。使用 (),我可以在 Sublime 3 中用 \1 替换。
      【解决方案4】:

      请注意,如果您使用超过 9 个捕获组,则必须使用语法 ${10}

      $10\10\{10}工作。

      【讨论】:

      • 谢谢!这对我替换并在捕获组的末尾添加一个数字很有帮助,例如要将1 附加到第二个捕获组,您需要使用像${2}1 这样的大括号; $21 指的是第 21 个捕获组,不存在。
      【解决方案5】:

      这是已获批准答案的视觉呈现。

      【讨论】:

      • 因为 $, [, (, 和 ) 是特殊字符,所以您应该使用反斜杠转义每个特殊字符。
      【解决方案6】:

      查看Sublime Text Unofficial Documentation's article on Search and Replace,看起来+(.+) 是您可能想要的捕获组...但我个人使用(.*) 并且效果很好。要以您所说的方式替换,您可能会喜欢这个conversation in the forums,特别是this post,它表示只需使用$1 来使用第一个捕获的组。

      因为图片胜于文字......

      之前:

      之后:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-28
        • 1970-01-01
        • 1970-01-01
        • 2013-07-31
        • 2018-05-25
        • 1970-01-01
        相关资源
        最近更新 更多