在 Rust 正则表达式中模拟 lookbehind 行为的最明智的方法是什么?

What's the most sensible way to emulate lookbehind behavior in Rust regex?

Rust regex crate 指出:

This crate provides a native implementation of regular expressions that is heavily based on RE2 both in syntax and in implementation. Notably, backreferences and arbitrary lookahead/lookbehind assertions are not provided.

在撰写本文时,"rust regex lookbehind" 没有从 DuckDuckGo 返回任何结果。

我以前从来没有解决过这个问题,但我可以想到两种方法:

方法 1(前进)

  1. 迭代 .captures() 以获得我想用作后视的模式。
  2. 匹配我真正想要在捕获之间匹配的东西。 (向前)

方法 2(反向)

  1. 匹配我真正想要匹配的模式。
  2. 对于每个匹配项,查找后向模式,直到前一个捕获的结束字节或字符串的开头。

这不仅看起来像一个巨大的痛苦,而且似乎很多边缘情况都会让我失望。有没有更好的方法来解决这个问题?

例子

给定一个字符串:

"Fish33-Tiger2Hyena4-"

我想提取 ["33-", "2", "4-"] 当且仅当每个都遵循 "Fish".

这样的字符串

如果没有激励性的例子,很难以一般的方式有效地回答您的问题。在许多情况下,您可以用两个正则表达式替换环视运算符——一个用于搜索候选项,另一个用于生成您感兴趣的实际匹配项。但是,这种方法并不总是可行的。

如果您真的遇到困难,那么您唯一的选择就是使用支持这些功能的正则表达式库。 Rust 绑定了其中的几个:

还有一个更具实验性的库,fancy-regex,它建立在 regex crate 之上。

如果您有一个正则表达式应用程序,其中有一个已知的一致模式,您希望将其用作回顾,另一种解决方法是使用 .splits() with the lookbehind-matching pattern as the argument (similar to the idea mentioned in )。这至少会为您提供字符串,这些字符串由它们与您想要查看的匹配项的邻接关系表示。

我不知道正则表达式方面的性能保证,但这至少意味着您可以对拆分结果进行 N 次(对于 N 次拆分)或对连接结果进行一次无后视正则表达式匹配根据需要。