我希望在 Sublime Text 2 中用正则表达式进行搜索替换。documentation on this 相当贫乏。具体来说,我想对组进行替换,因此类似于转换此文本:
Hello my name is bob
而这个搜索词:
查找内容:my name is (\w)+
替换为:my name used to be $(1)
搜索词工作得很好,但我想不出一种方法来实际使用 regexp 组进行替换。
通常,对于第一个捕获组(括号中的模式的第一个匹配项),反向引用是 $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 */
替换字符串:边距:$1px 或边距:\1px
搜索字符串 (CORRECT): margin: ([0-9]*)em // 带括号
搜索字符串(不正确):边距:[0-9]*em
正确案例示例:使用 margin: ([0-9]*)em
搜索字符串(带括号)。用 ( )
括号括住所需的匹配段(例如 $1
或 \1
),如下所示:
查找:边距:([0-9]*)em(带括号)
替换为:边距:$1px 或边距:\1px
结果:
margin: 10px;
margin: 2px;
不正确的案例示例: 使用 margin: [0-9]*em
搜索字符串(不带括号)。以下正则表达式模式将匹配所需的行,但匹配的段在替换字符串中将不可用,如 $1
或 \1
等变量:
查找:边距:[0-9]*em(不带括号)
替换为:边距:$1px 或边距:\1px
结果:
margin: px; /* `$1` is undefined */
margin: px; /* `$1` is undefined */
这是已批准答案的视觉呈现。
https://i.stack.imgur.com/pZLrH.gif
请注意,如果您使用超过 9 个捕获组,则必须使用语法 ${10}
。
$10
或 \10
或 \{10}
将不工作。
1
附加到您需要使用 ${2}1
之类的大括号的第二个捕获组; $21 指的是第 21 个捕获组,它不存在。
查看 Sublime Text Unofficial Documentation's article on Search and Replace,看起来 +(.+)
是您可能想要的捕获组...但我个人使用 (.*)
并且效果很好。要按照您所说的方式替换,您可能会喜欢这个 conversation in the forums,特别是 this post,它表示只需使用 $1
来使用第一个捕获的组。
既然图片胜于文字...
https://i.stack.imgur.com/E3LyO.png
https://i.stack.imgur.com/nrT4K.png
不定期副业成功案例分享
\0
等于空字符,而\0ddd
用作带有代码点 ddd 的字符的转义)。但是,根据 this page,$0
似乎确实在 Sublime2 中用作“退出标记”(尽管我很难找到足够的示例来准确计算在 Sublime2 中如何使用退出标记)。$0
在 Sublime Text 2/3 中用于将光标置于片段扩展的退出处。 More on snippets。$0
是整个正则表达式匹配;$1
是第一个捕获组。$0
在 Sublime 3 中为我工作以获得整个匹配的表达式。我在整个正则表达式周围有一个捕获组,中间有一个嵌套捕获组,$1
引用了内部捕获组,这很奇怪,因为我认为捕获组是通过开括号来排序的。希望这对某人有帮助!