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

bri*_*tar 7 regex rust regex-lookarounds

Rust 正则表达式表明:

此crate提供了正则表达式的本机实现,它在语法和实现方面都基于RE2.值得注意的是,未提供反向引用和任意前瞻/后瞻断言.

在撰写本文时,"Rust regex lookbehind"回来后没有DuckDuckGo的结果.

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

方法1(前进)

  1. 迭代.captures()我想用作lookbehind的模式.
  2. 匹配我想要在捕获之间匹配的东西.(向前)

方法2(反向)

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

这不仅是一个巨大的痛苦,似乎很多边缘案件都会让我感到震惊.有没有更好的方法来解决这个问题?

给出如下字符串:

"Fish33-Tiger2Hyena4-"

我想提取["33-", "2", "4-"]iff每个跟随一个字符串之类的"Fish".

Bur*_*hi5 12

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

如果你真的卡住了,那么你唯一的选择是使用支持这些功能的正则表达式库.Rust绑定了其中几个:

还有一个更实验性的库,fancy-regex,它建立在regex箱子的顶部.


bri*_*tar 4

如果您有一个正则表达式应用程序,其中有一个已知的一致模式想要用作后向查找,则另一种解决方法是使用.splits()后向匹配模式作为参数(类似于其他答案中提到的想法)。这至少会为您提供由与您想要向后查找的匹配项相邻的字符串表示的字符串。

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