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

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

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

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

最佳答案

您可以使用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的风险,因为返回值会有所不同)。有关CompleteStr的详细信息,请参见此文档:https://github.com/Geal/nom/blob/master/doc/upgrading_to_nom_4.md#dealing-with-incomplete-usage

关于rust - 如何对字符串进行吞噬直到定界符或rust/nom结尾,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54009610/

10-12 18:52