如何吞咽字符串直到出现分隔符或以rust/nom结尾

如何吞咽字符串直到出现分隔符或以rust/nom结尾,rust,parser-combinators,nom,Rust,Parser Combinators,Nom,我正在学习nom,作为一个测试示例,我试图解析一个字符串直到一个分隔符。如果我的分隔符是,比如说,/,那么我希望匹配所有内容,直到找到该分隔符为止。为此,需要一个类似 named!(gobbledygook, take_until!("/")); 工作。但我还想匹配在该分隔符之前结束的字符串。所以我希望foo/bar和foo都返回“foo”。目前我似乎在名单上找不到合适的东西 我想可以扫描分隔符或字符串的结尾,但这似乎是一种常见的情况,我缺少了一些明显的东西?你可以用花点时间宏。此代码: #[

我正在学习nom,作为一个测试示例,我试图解析一个字符串直到一个分隔符。如果我的分隔符是,比如说,
/
,那么我希望匹配所有内容,直到找到该分隔符为止。为此,需要一个类似

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
告诉nom
foo
是完整字符串(即,完整字符串实际上是
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
告诉nom
foo
是完整字符串(即,完整字符串实际上是
foofoo/bar
,其中返回的值不同)。有关
CompleteStr
的详细信息,请参阅本文档:

谢谢,我已经准备好了。或者,我不得不使用CompleteByteSicle,因为我使用的是字节而不是字符串。谢谢,我用它来处理这个问题。或者,我不得不使用CompleteByteSlice,因为我使用的是字节而不是字符串。