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

时间:2019-01-02 16:13:44

标签: rust parser-combinators nom

我正在学习nom,作为测试示例,我试图解析一个字符串,直到定界符为止。如果我的定界符是/,那么我想匹配所有内容,直到该定界符为止。为此,解析器就像

named!(gobbledygook, take_until!("/"));

有效。但我也想匹配在该分隔符之前结束的字符串。因此,我希望foo/barfoo都返回“ foo”。在https://github.com/Geal/nom/blob/master/doc/choosing_a_combinator.md的列表中似乎找不到合适的东西。

我想可以扫描定界符或字符串的末尾,但这似乎是一种常见情况,应该明显缺少我所需要的东西?

1 个答案:

答案 0 :(得分:2)

您可以使用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并没有返回值的风险)会有所不同)。有关CompleteStrhttps://github.com/Geal/nom/blob/master/doc/upgrading_to_nom_4.md#dealing-with-incomplete-usage

的详细信息,请参见此文档。