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

问题描述 投票:5回答:2

Rust regex crate说:

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

在撰写本文时,“Rust regex lookbehind”回来后没有DuckDuckGo的结果。

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

方法1(前进)

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

方法2(反向)

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

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

给出如下字符串:

"Fish33-Tiger2Hyena4-"

我想提取["33-", "2", "4-"] iff每个跟随像"Fish"这样的字符串。

regex rust regex-lookarounds
2个回答
10
投票

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

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

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


1
投票

如果你有一个正则表达式应用程序,你有一个已知的一致模式,你想用作lookbehind,另一个解决方法是使用.splits()与lookbehind匹配模式作为参数(类似于the other answer中提到的想法)。这至少会给你一些字符串,这些字符串与你想要看到的匹配相邻。

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

© www.soinside.com 2019 - 2024. All rights reserved.