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


440

我正在寻找用Sublime Text 2中的正则表达式进行搜索替换。关于此文档相当贫乏。具体来说,我想对组进行替换,因此需要进行如下转换:

Hello my name is bob

这个搜索词:

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

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

搜索字词效果很好,但我找不到使用regexp组进行替换的方法。

Answers:


583

通常,第一个捕获组(括号中的模式的第一个匹配项)的反向引用为$1\1(反斜杠一个),实际上Sublime支持两种语法。因此,请尝试:

my name used to be \1

要么

my name used to be $1

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

my name is (\w)+

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

my name is (\w+)

15
除了,不是$0吗?
Skylar Saveland

11
不,$ 0不能在正则表达式中用作后向引用(因为它\0等于空字符,并且\0ddd用作代码点为ddd的字符的转义符)。但是,$0根据此页面,Sublime2中似乎确实将其用作“退出标记” (尽管我很难找到足够的示例来准确确定Sublime2中如何使用退出标记)。
很棒的2013年

3
$0Sublime Text 2/3中使用了退出标记,将光标置于代码段扩展的退出位置。有关片段的更多信息
jrhorn424 2013年

2
$ 0仍可用于反向引用Sublime Text 2中的整个表达式
sturrockad

2
$0是整个正则表达式匹配项;$1是第一个捕获组。
Oletha

103

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

对于:

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


52

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

虽然前面的答案是正确的,但有一点要强调!所有的搜索字符串匹配的段要在您使用替换字符串必须由封闭( )括号,否则,这些匹配的段不会对定义的变量,如访问$1$2或者\1\2等。

例如,我们要用“ px”替换“ em”,但保留数字值:

    margin: 10em;  /* Expected: margin: 10px */
    margin: 2em;   /* Expected: margin: 2px */
  • 替换字符串:margin: $1pxmargin: \1px
  • 搜索字符串(CORRECT):margin: ([0-9]*)em//带括号
  • 搜索字符串(INCORRECT): 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 */

1
谢谢,这个答案确实指出了一个有趣的事实,它解决了我的问题。
恩克

感谢您指出。随着(),我可以做\ 1崇高3.更换
杰弗里

47

这是批准答案的直观展示。

在此处输入图片说明


为什么找不到$_SESSION[(\w+)?谢谢
Toni Michel Caubet,

因为$,[,(和)是特殊字符,所以您应该使用反斜杠对每个特殊字符进行转义。
zeeawan '19

25

请注意,如果使用9个以上的捕获组,则必须使用语法${10}

$10\10\{10}无法正常工作。


谢谢!这对我替换并在捕获组的末尾添加一个数字很有帮助,例如,将a附加1到第二个捕获组中,您需要使用大括号,例如${2}1; $ 21表示不存在的第21个捕获组。
埃里克

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.