ChatGPT解决这个技术问题 Extra ChatGPT

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

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

Hello my name is bob

而这个搜索词:

查找内容:my name is (\w)+

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

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


B
Bobulous

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

my name used to be \1

或者

my name used to be $1

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

my name is (\w)+

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

my name is (\w+)

不,$0 不用作正则表达式中的反向引用(因为 \0 等于空字符,而 \0ddd 用作带有代码点 ddd 的字符的转义)。但是,根据 this page$0 似乎确实在 Sublime2 中用作“退出标记”(尽管我很难找到足够的示例来准确计算在 Sublime2 中如何使用退出标记)。
退出标记 $0 在 Sublime Text 2/3 中用于将光标置于片段扩展的退出处。 More on snippets
$0 仍然适用于反向引用 Sublime Text 2 中的整个表达式
$0 是整个正则表达式匹配; $1 是第一个捕获组。
$0 在 Sublime 3 中为我工作以获得整个匹配的表达式。我在整个正则表达式周围有一个捕获组,中间有一个嵌套捕获组,$1 引用了内部捕获组,这很奇怪,因为我认为捕获组是通过开括号来排序的。希望这对某人有帮助!
C
CrnaStena

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

为了:

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


H
Hrvoje Golcic

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

虽然前面的答案是正确的,但有一点需要强调!您要在替换字符串中使用的所有搜索字符串中匹配的段必须( )括号括起来,否则这些匹配$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 */

谢谢,这个答案确实指出了一个有趣的事实,它解决了我的问题。
感谢您指出。使用 (),我可以在 Sublime 3 中用 \1 替换。
z
zeeawan

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

https://i.stack.imgur.com/pZLrH.gif


因为 $, [, (, 和 ) 是特殊字符,所以您应该使用反斜杠转义每个特殊字符。
A
Andreas Haferburg

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

$10\10\{10}工作。


谢谢!这对我替换并在捕获组的末尾添加一个数字很有帮助,例如,将 1 附加到您需要使用 ${2}1 之类的大括号的第二个捕获组; $21 指的是第 21 个捕获组,它不存在。
我试图将 1 美元替换为 1 美元和 0 美元,但不是 10 美元。你的回答解决了这个问题。现在我使用 ${1}0 并添加了 0 。谢谢..
B
Blairg23

查看 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