2

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

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

我找到了一本Oniguruma 手册,上面写着\G设置比赛开始位置,但这对我不起作用。

4

2 回答 2

3

我不认为 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没有这个限制。

于 2015-05-21T23:26:45.693 回答
3

Ruby 曾经使用Oniguruma作为正则表达式引擎,但后来它从 Ruby 2.0 切换到了Onigmo(Oniguruma 的一个分支)。Onigmo 支持几种新的构造,例如条件构造和例程调用(允许您编写递归正则表达式)。

直接等效于\zsis \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

于 2015-05-22T03:58:13.543 回答