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

时间:2016-06-22 16:13:17

标签: regex rust regex-lookarounds

Rust regex crate声明:

  

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

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

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

方法1(前进)

  1. 迭代.captures()我希望用作lookbehind的模式。
  2. 匹配我想要在捕获之间匹配的东西。 (正向)
  3. 方法2(反向)

    1. 匹配我真正想要匹配的模式。
    2. 对于每个匹配,查找lookbehind模式,直到上一次捕获的结束字节或字符串的开头。
    3. 这不仅是一个巨大的痛苦,似乎还有许多边缘案例会让我失望。有没有更好的方法来解决这个问题?

      实施例

      给出一个字符串:

      "Fish33-Tiger2Hyena4-"

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

2 个答案:

答案 0 :(得分:9)

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

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

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

答案 1 :(得分:1)

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

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