正则表达式中的重叠匹配?(rust正则表达式引擎)

hi3rlvi2  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(112)

我目前正在尝试解决Advent of Code 2023 day 1,但第二部分有像threeight这样的短语,我不确定如何匹配。我最初的方法是(?:[0-9]|zero|one|two|three|four|five|six|seven|eight|nine),但这不支持拼写出来的数字之间的重叠。
我知道regex crate不支持lookarounds,但即使有了它们,我也不知道如何在同一个正则表达式中处理[0-9]。

6ju8rftf

6ju8rftf1#

我知道regex crate不支持lookarounds,但即使有了它们,我也不知道如何在同一个regex中处理[0-9]。
你可以在lookaheadAssert中捕获,但是lookaheadAssert实际上并不匹配任何东西。所以如果你lookahead然后只匹配一个字符,那么“lookahead捕获”将应用于每个索引,因此你会得到每个可能的出现。
我不确定如何匹配。
简单的解决方案是一次提取一个匹配项。当你有第一个捕获时,你可以检索它的起始索引,递增(通常你必须跳到下一个char,但是AOC是全异步的,所以你可以只递增一个字节),然后寻找下一个匹配项。
另一种方法是使用RegexSet,因为它支持匹配
可能重叠
正则表达式:而不是建立一个交替组,你只是使用每个数字作为一个regex在集中。虽然这只告诉你哪些regex匹配,所以你仍然需要重新检查,如果多个regex匹配,知道什么是高和低。
最后,你可以使用底层的aho-corasick,实际的算法会默认找到重叠的出现,所以这是开箱即用的。

jpfvwuh4

jpfvwuh42#

您可能已经这样做了,但我是通过查找第一个匹配项,然后反转搜索字符串和正则表达式中的字符串,并在反转后的字符串中搜索第一个匹配项来实现的。

相关问题