如果我只想用Atom中的其他内容替换部分匹配,我该怎么做?
Ruby正则表达式解决方案可能会起作用,因为Ruby使用的正则表达式引擎非常像Oniguruma(由Atom使用)。
我找到了Oniguruma manual,其中\G
设置了匹配开始位置,但这对我不起作用。
答案 0 :(得分:2)
我认为Ruby与\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的外观需要具有固定大小的模式(或固定大小的几种替代方案) - Vim的\zs
没有限制。
答案 1 :(得分:2)
Ruby曾经使用Oniguruma作为正则表达式引擎,但后来从Ruby 2.0切换到Onigmo(Oniguruma的一个分支)。 Onigmo支持几种新的构造,例如条件构造和例程调用(允许你编写递归正则表达式)。
直接等效于\zs
的是\K
,仅在Onigmo中受支持。请注意,\K
和后视不等效。
要演示其中一种情况,请给出字符串aaaa
:
a\Ka
从索引1,3开始有2个匹配,但是当引擎在索引0和2处执行搜索时会找到这些匹配。(?<=a)a
从索引1,2,3开始有3场比赛。差异来自\K
(或\zs
)仅修改组0的起始索引(整个表达式匹配的文本)这一事实。引擎开始搜索下一个匹配的位置与剥离所有\K
时相同的模式相同。
没有直接等同于\ze
。但是,对于\ze
不在任何组内的简单情况,您可以使用预测来模仿行为,如Idan Arye's answer所示。 \ze
非常类似于预测,因为引擎会根据\ze
设置的结束索引搜索下一个匹配项,而不是\ze
之后模式所达到的索引。 / p>