如果我只想用 Atom 中的其他内容替换匹配的一部分,我该怎么做?
Ruby 正则表达式解决方案可能会起作用,因为 Ruby 使用的正则表达式引擎非常类似于 Oniguruma(由 Atom 使用)。
我找到了一本Oniguruma 手册,上面写着\G
设置比赛开始位置,但这对我不起作用。
如果我只想用 Atom 中的其他内容替换匹配的一部分,我该怎么做?
Ruby 正则表达式解决方案可能会起作用,因为 Ruby 使用的正则表达式引擎非常类似于 Oniguruma(由 Atom 使用)。
我找到了一本Oniguruma 手册,上面写着\G
设置比赛开始位置,但这对我不起作用。
我不认为 Ruby 与 and 有直接等价物\zs
,\ze
但您可以使用 lookahead( (?=pat)
) 和 lookbehind( (?<=pat)
) 来模仿它们的行为:
[1] pry(main)> ('abc'.match /(?<=a)b(?=c)/)
=> #<MatchData "b">
[2] pry(main)> ('bc'.match /(?<=a)b(?=c)/)
=> nil
[3] pry(main)> ('ab'.match /(?<=a)b(?=c)/)
=> nil
不幸的是,Ruby 的lookbehind 需要固定大小的模式(或几个固定大小的替代方案)——Vim\zs
没有这个限制。
Ruby 曾经使用Oniguruma作为正则表达式引擎,但后来它从 Ruby 2.0 切换到了Onigmo(Oniguruma 的一个分支)。Onigmo 支持几种新的构造,例如条件构造和例程调用(允许您编写递归正则表达式)。
直接等效于\zs
is \K
,仅在 Onigmo 中支持。请注意,它\K
和look-behind 不等价。
为了演示其中一种情况,给定字符串aaaa
:
a\Ka
从索引 1、3 开始有 2 个匹配项,但是当引擎在索引 0 和 2 处执行搜索时会找到这些匹配项。(?<=a)a
从索引 1、2、3 开始有 3 个匹配项。不同之处在于\K
(or \zs
) 仅修改组 0 的起始索引(与整个表达式匹配的文本)。引擎开始搜索下一个匹配的位置与剥离所有相同模式时的位置相同\K
。
没有直接等价于\ze
。\ze
但是,对于不在任何组内的简单情况,您可以通过使用前瞻来模仿行为,如Idan Arye 的回答所示。\ze
与前瞻非常相似,因为引擎会根据 设置的结束索引\ze
而不是模式 after 到达的索引来搜索下一个匹配项\ze
。