我正在学习nom,作为测试示例,我试图解析一个字符串,直到定界符为止。如果我的定界符是/
,那么我想匹配所有内容,直到该定界符为止。为此,解析器就像
named!(gobbledygook, take_until!("/"));
有效。但我也想匹配在该分隔符之前结束的字符串。因此,我希望foo/bar
和foo
都返回“ foo”。在https://github.com/Geal/nom/blob/master/doc/choosing_a_combinator.md的列表中似乎找不到合适的东西。
我想可以扫描定界符或字符串的末尾,但这似乎是一种常见情况,应该明显缺少我所需要的东西?
答案 0 :(得分:2)
您可以使用take_while!
宏来执行此操作。这段代码:
#[macro_use]
extern crate nom;
use nom::types::CompleteStr
named!(gobbledygook<CompleteStr, CompleteStr>,
take_while!(|ch| ch != '/')
);
fn main() {
println!("1: {}", gobbledygook(CompleteStr("foo/bar")).unwrap().1);
println!("2: {}", gobbledygook(CompleteStr("foo")).unwrap().1);
}
打印:
1: foo
2: foo
请注意,您需要使用CompleteStr
来告诉nom foo
是完整字符串(即,完整的字符串实际上是foofoo/bar
并没有返回值的风险)会有所不同)。有关CompleteStr
:https://github.com/Geal/nom/blob/master/doc/upgrading_to_nom_4.md#dealing-with-incomplete-usage