在 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(前进)
- 迭代
.captures()
以获得我想用作后视的模式。
- 匹配我真正想要在捕获之间匹配的东西。 (向前)
方法 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 次拆分)或对连接结果进行一次无后视正则表达式匹配根据需要。
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(前进)
- 迭代
.captures()
以获得我想用作后视的模式。 - 匹配我真正想要在捕获之间匹配的东西。 (向前)
方法 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 次拆分)或对连接结果进行一次无后视正则表达式匹配根据需要。