我现在正在试着解Advent of Code 2023 day 1,但第二部分有threeight
这样的短语,我不确定如何匹配.我最初的方法是(?:[0-9]|zero|one|two|three|four|five|six|seven|eight|nine)
,但这不支持拼写出来的数字之间的重叠.
我知道regex
crate不支持lookarounds,但即使有了它们,我也不知道如何在同一个正则表达式中处理[0-9].
我现在正在试着解Advent of Code 2023 day 1,但第二部分有threeight
这样的短语,我不确定如何匹配.我最初的方法是(?:[0-9]|zero|one|two|three|four|five|six|seven|eight|nine)
,但这不支持拼写出来的数字之间的重叠.
我知道regex
crate不支持lookarounds,但即使有了它们,我也不知道如何在同一个正则表达式中处理[0-9].
我知道正则表达式 crate 不支持查找,但即使使用它们,我也不知道如何在相同的正则表达式中使用[0-9].
您可以在lookahead断言中捕获,但lookahead断言实际上并不包含任何内容.因此,如果你只匹配一个字符,那么"前瞻捕获"将应用于每个索引,因此你将获得每一个可能的出现.
我不确定怎么匹配.
简单的解决方案是提取one at a time个匹配项.当你有了第一个捕获,你可以检索它的start index,递增(通常你必须跳到下一个char
,但AOC都是ASCII,所以你只需要递增一个字节),然后寻找下一个匹配.
另一种方法是使用RegexSet
,因为它支持匹配
可能重叠
正则表达式:您只需使用集合中的每个数字作为正则表达式,而不是构建一个交替组.虽然这只告诉您哪些正则表达式匹配,因此您仍然需要重新判断多个正则表达式是否匹配,以了解最高值和最低值.
最后,您可以更低地使用底层的aho-corasick,实际算法将在默认情况下找到重叠的出现项,因此that's supported out of the box.