如何吞咽字符串直到出现分隔符或以rust/nom结尾
我正在学习nom,作为一个测试示例,我试图解析一个字符串直到一个分隔符。如果我的分隔符是,比如说,如何吞咽字符串直到出现分隔符或以rust/nom结尾,rust,parser-combinators,nom,Rust,Parser Combinators,Nom,我正在学习nom,作为一个测试示例,我试图解析一个字符串直到一个分隔符。如果我的分隔符是,比如说,/,那么我希望匹配所有内容,直到找到该分隔符为止。为此,需要一个类似 named!(gobbledygook, take_until!("/")); 工作。但我还想匹配在该分隔符之前结束的字符串。所以我希望foo/bar和foo都返回“foo”。目前我似乎在名单上找不到合适的东西 我想可以扫描分隔符或字符串的结尾,但这似乎是一种常见的情况,我缺少了一些明显的东西?你可以用花点时间宏。此代码: #[
/
,那么我希望匹配所有内容,直到找到该分隔符为止。为此,需要一个类似
named!(gobbledygook, take_until!("/"));
工作。但我还想匹配在该分隔符之前结束的字符串。所以我希望foo/bar
和foo
都返回“foo”。目前我似乎在名单上找不到合适的东西
我想可以扫描分隔符或字符串的结尾,但这似乎是一种常见的情况,我缺少了一些明显的东西?你可以用
花点时间代码>宏。此代码:
#[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);
}
请注意,您需要使用CompleteStr
告诉nomfoo
是完整字符串(即,完整字符串实际上是foofoo/bar
,其中返回的值不同)。有关CompleteStr
的详细信息,请参阅本文档:您可以使用花点时间代码>宏。此代码:
#[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);
}
请注意,您需要使用CompleteStr
告诉nomfoo
是完整字符串(即,完整字符串实际上是foofoo/bar
,其中返回的值不同)。有关CompleteStr
的详细信息,请参阅本文档:谢谢,我已经准备好了。或者,我不得不使用CompleteByteSicle,因为我使用的是字节而不是字符串。谢谢,我用它来处理这个问题。或者,我不得不使用CompleteByteSlice,因为我使用的是字节而不是字符串。