我现在正在试着解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.

Rust相关问答推荐

如何在不安全的代码中初始化枚举 struct

Rust中的相互递归特性与默认实现

文档示例需要导入相关的 struct ,但仅在运行测试时.这是故意的行为吗?

为什么BitVec缺少Serialize trait?

如何在Bevy/Rapier3D中获得碰撞机的计算质量?

无法理解铁 rust &S错误处理

如何导入crate-type=[";cdylib;]库?

更合理的方法来设计样条线函数器?

你能在Rust中弃用一个属性吗?

.在 Rust 模块标识符中

当推送到 HashMap 中的 Vector 时,类型 `()` 无法取消引用

在 Rust 中忽略 None 值的正确样式

Rust中的标记特征是什么?

从光标位置旋转精灵

按下 Ctrl + C 时优雅地停止命令并退出进程

Rust 中的方法调用有什么区别?

如何在 Rust 中返回通用 struct

通用函数中的生命周期扣除和borrow (通用测试需要)

我可以在不调用 .clone() 的情况下在类型转换期间重用 struct 字段吗?

带有库+多个二进制文件的Cargo 项目,二进制文件由多个文件组成?