如何使用 nom 吞噬字符串直到分隔符或结尾?
How to use nom to gobble a string until a delimiter or the end?
我正在学习 nom,作为测试示例,我正在尝试解析字符串直到出现分隔符。如果我的定界符是 /
,那么我想匹配该定界符之前的所有内容。为此,像这样的解析器可以工作:
named!(gobbledygook, take_until!("/"));
我还想匹配在该定界符之前结束的字符串,所以我希望 foo/bar
和 foo
到 return“foo”。我似乎无法在 list of parsers and combinators.
中找到合适的内容
我想可以扫描字符串的定界符或结尾,但似乎这是很常见的情况,应该有一些明显的东西我遗漏了。
您可以使用 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
我正在学习 nom,作为测试示例,我正在尝试解析字符串直到出现分隔符。如果我的定界符是 /
,那么我想匹配该定界符之前的所有内容。为此,像这样的解析器可以工作:
named!(gobbledygook, take_until!("/"));
我还想匹配在该定界符之前结束的字符串,所以我希望 foo/bar
和 foo
到 return“foo”。我似乎无法在 list of parsers and combinators.
我想可以扫描字符串的定界符或结尾,但似乎这是很常见的情况,应该有一些明显的东西我遗漏了。
您可以使用 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