You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Nom实现类似正则表达式"(...)"?的可选匹配功能?

在Nom中实现正则式?的简洁方案

Nom中自带的opt组合子正好对应正则里的?操作符,专门用来处理「匹配0次或1次」的场景,比你用many_m_n(0,1)的写法更贴合Nom的设计风格,代码也更简洁。

针对你需要的「成功返回解析字符串,失败返回空字符串」的需求,可以这样实现:

use nom::{combinator::opt, sequence::map};

// 假设parser_function是你的目标解析器,返回&str或String类型
let (rest, parsed_thing) = opt(parser_function)
    .map(|opt_result| opt_result.unwrap_or_default())
    .parse(i)?;

说明:

  • opt(parser_function):尝试运行传入的解析器,成功则返回Some(解析结果),失败则返回None,不会中断整个解析流程。
  • map(...):将Option类型转换为最终需要的字符串——unwrap_or_default()会在None时返回对应类型的默认值,对于&str或String来说就是空字符串,完美匹配你的需求。

如果你的parser_function返回的是&str且需要转为String,可以调整map里的逻辑:

.map(|opt_s| opt_s.map_or_else(String::new, |s| s.to_string()))

内容的提问来源于stack exchange,提问作者exocortex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 22:36:05