我希望在Sublime Text 2中用正则表达式做搜索替换。关于这方面的文档相当贫乏。具体来说,我想在组上做一个替换,比如转换这个文本:
你好,我叫鲍勃
这个搜索词是:
我的名字是(\w)+
替换为:my name used to be $(1)
搜索词工作得很好,但我想不出使用regexp组实际执行替换的方法。
我希望在Sublime Text 2中用正则表达式做搜索替换。关于这方面的文档相当贫乏。具体来说,我想在组上做一个替换,比如转换这个文本:
你好,我叫鲍勃
这个搜索词是:
我的名字是(\w)+
替换为:my name used to be $(1)
搜索词工作得很好,但我想不出使用regexp组实际执行替换的方法。
当前回答
看看Sublime Text非官方文档关于搜索和替换的文章,看起来+(.+)是你可能想要的捕获组…但我个人使用(.*),它工作得很好。用你所说的方式来替换,你可能会喜欢论坛上的这个对话,特别是这篇文章,它说只需使用1美元就可以使用第一个捕获的组。
既然图片比文字更好……
之前:
后:
其他回答
通常,对于第一个捕获组(括号中模式的第一个匹配),反向引用是$1或\1(反斜杠1),实际上Sublime支持这两种语法。所以尝试:
my name used to be \1
or
my name used to be $1
还要注意您原始的捕获模式:
my name is (\w)+
是不正确的,将只捕获名称的最后一个字母,而不是整个名称。您应该使用以下模式来捕获名称的所有字母:
my name is (\w+)
我也遇到过类似的问题:
很多条纹都是这样的 Don Jos6去了(正确的是Don José去了)
我使用了这个工具: https://coding.tools/regex-replace
正则表达式:([a-z]
替换为:$1é
点击“Regex Replace”按钮。 结果:
Don José去了
它也适用于谷歌表。
顺便说一下,在上面的问题中:
For:
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: $1px或margin: \1px 搜索字符串(正确):margin: ([0-9]*)em //带括号 搜索字符串(不正确):margin: [0-9]*em
使用margin: ([0-9]*)em搜索字符串(带括号)。用()括号括起所需匹配的段(例如$1或\1),如下所示:
查找:margin: ([0-9]*)em(带括号) 替换为:margin: $1px或margin: \1px 结果:
margin: 10px;
margin: 2px;
使用margin: [0-9]*em搜索字符串(不带括号)。下面的正则表达式模式将匹配所需的行,但匹配的段将无法在替换后的字符串中作为变量,如$1或\1:
查找:margin: [0-9]*em(不带括号) 替换为:margin: $1px或margin: \1px 结果:
margin: px; /* `$1` is undefined */
margin: px; /* `$1` is undefined */
以下是已批准答案的可视化演示。