我正在学习 nom,作为一个测试示例,我试图解析一个字符串直到一个分隔符。如果我的分隔符是/
,那么我想匹配该分隔符之前的所有内容。为此,像这样的解析器可以工作:
named!(gobbledygook, take_until!("/"));
我还想匹配一个在该分隔符之前结束的字符串,所以我想要两者foo/bar
并foo
返回“foo”。我似乎在解析器和组合器列表中找不到任何合适的东西。
我想可以扫描分隔符或字符串的结尾,但似乎这是一种常见的情况,应该有一些明显的东西我遗漏了。
我正在学习 nom,作为一个测试示例,我试图解析一个字符串直到一个分隔符。如果我的分隔符是/
,那么我想匹配该分隔符之前的所有内容。为此,像这样的解析器可以工作:
named!(gobbledygook, take_until!("/"));
我还想匹配一个在该分隔符之前结束的字符串,所以我想要两者foo/bar
并foo
返回“foo”。我似乎在解析器和组合器列表中找不到任何合适的东西。
我想可以扫描分隔符或字符串的结尾,但似乎这是一种常见的情况,应该有一些明显的东西我遗漏了。
您可以使用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
,其中 cas 返回的值会有所不同)。有关详细信息,请参阅此文档CompleteStr
:https ://github.com/Geal/nom/blob/master/doc/upgrading_to_nom_4.md#dealing-with-incomplete-usage