正则表达式搜索替换Sublime Text 2

我希望在Sublime Text 2中用正则表达式做搜索替换。关于此的文档相当贫血。具体来说,我想在组上做一个替换,比如转换这个文本:

Hello my name is bob

这个搜索词是:

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

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

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

358514 次浏览

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

my name used to be \1

my name used to be $1

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

my name is (\w)+

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

my name is (\w+)

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

:

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

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

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

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

    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),如下所示:

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

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

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

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

$10\10\{10}工作。

以下是已批准答案的可视化演示。

enter image description here

查看Sublime Text非官方文档关于搜索和替换的文章,看起来+(.+)是你可能想要的捕获组…但我个人使用(.*),它工作得很好。要用你所说的方式替换,你可能喜欢这个论坛中的对话,特别是这篇文章,它说简单地使用$1来使用第一个捕获的组。

既然图片比文字更好……

< >强: before find/replace . < / p >

< >强后: after find/replace . < / p >