将前瞻值保留在正则表达式中

Keeping the lookahead value in regular expression

假设我有字符串 abcdefghi 如果我应用正则表达式

m/([a-z])([a-z])/g

对它,我得到了不相交的对 ab, cd, ef, gh.

我想要的是所有重叠对 ab, bc, cd, de, ef, fg, gh, hi.

当我使用前瞻时,比如

m/([a-z])(?=[a-z])/g

我得到每对的第一个字母 abcdefgh,但是不保留先行本身。

我如何告诉正则表达式引擎我想要第一个字母 以及先行 ,以获得成对的字母 abbc, cd, de, ef, fg, gh, hi?

前瞻周围的 () 是非捕获的,并且因为前瞻是 0 宽度匹配,所以您不会在结果中得到 "looked at" 的字符。

你只需要用一个捕获组将前瞻捕获的内容包围起来:

([a-z])(?=([a-z]))

附带说明一下,还有其他方法可以获得重叠对,例如使用循环到(字符串的长度 - 2)的 for 循环。您可能还想考虑这些选项。

您可以依靠引擎 BUMP ALONG 功能来做到这一点。
通过使用包含单个捕获组的零宽度断言来包含
每对。

由于引擎没有消耗任何字符,它有一个内置的
避免无限循环的机制,即递增当前位置
1.

(?=([a-z]{2}))

https://regex101.com/r/GYcgiZ/1

或者,

自己匹配2消耗1即可。

(?=([a-z]{2})).

https://regex101.com/r/re917b/1