相当于Vim的正则表达式开始和结束匹配(`\ zs`和`\ ze`)?

时间:2015-05-21 22:47:12

标签: ruby regex atom-editor oniguruma

如果我只想用Atom中的其他内容替换部分匹配,我该怎么做?

Ruby正则表达式解决方案可能会起作用,因为Ruby使用的正则表达式引擎非常像Oniguruma(由Atom使用)。

我找到了Oniguruma manual,其中\G设置了匹配开始位置,但这对我不起作用。

2 个答案:

答案 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>