我正在学习nom,并作为测试示例,尝试解析一个字符串,直到定界符为止。如果我的分隔符是/
,那么我想匹配所有内容,直到该分隔符为止。为此,一个解析器像
named!(gobbledygook, take_until!("/"));
作品。但是我也想匹配在该定界符之前结束的字符串。因此,我希望
foo/bar
和foo
都返回“foo”。我似乎在https://github.com/Geal/nom/blob/master/doc/choosing_a_combinator.md的列表中找不到合适的东西。我想可以扫描定界符或字符串的结尾,但是似乎这是一种常见的情况,应该明显缺少我所缺少的东西?
最佳答案
您可以使用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关于rust - 如何对字符串进行吞噬直到定界符或rust/nom结尾,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54009610/