478

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

Hello my name is bob

而这个搜索词:

找什么:my name is (\w)+

用。。。来代替:my name used to be $(1)

搜索词工作得很好,但我想不出一种方法来实际使用 regexp 组进行替换。

4

6 回答 6

637

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

my name used to be \1

或者

my name used to be $1

另请注意,您的原始捕获模式:

my name is (\w)+

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

my name is (\w+)
于 2012-08-05T20:41:40.567 回答
109

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

为了:

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",但它不是您想要替换的分组。

于 2012-12-05T21:38:49.133 回答
68

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

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

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

    margin: 10em;  /* Expected: margin: 10px */
    margin: 2em;   /* Expected: margin: 2px */
  • 替换字符串:margin: $1pxmargin: \1px
  • 搜索字符串 (CORRECT): 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搜索字符串(不带括号)。以下正则表达式模式将匹配所需的行,但匹配的段在替换字符串中将不可用,例如$1or \1

  • 查找:(margin: [0-9]*em不带括号)
  • 替换为:margin: $1pxmargin: \1px
  • 结果:
    margin: px; /* `$1` is undefined */
    margin: px; /* `$1` is undefined */
于 2014-08-07T12:12:42.093 回答
50

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

在此处输入图像描述

于 2017-02-15T18:59:12.157 回答
30

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

$10\10\{10}不起作用

于 2016-09-07T16:16:35.630 回答
2

查看Sublime Text 非官方文档关于 Search and Replace 的文章,它看起来像是+(.+)您可能想要的捕获组......但我个人使用(.*)并且效果很好。要以您所说的方式替换,您可能会喜欢论坛中的这个对话,特别是这篇文章,它说简单地$1使用第一个捕获的组。

既然图片胜于文字...

前: 在查找/替换之前

后: 查找/替换后

于 2019-06-26T21:17:03.053 回答