如何用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
相关产品推荐
相关产品推荐

