rust - 如何使用 nom 吞噬字符串直到分隔符或结尾?

标签 rust parser-combinators nom

我正在学习 nom,作为一个测试示例,我正在尝试解析字符串直到出现分隔符。如果我的定界符是 /,那么我想匹配该定界符之前的所有内容。为此,像这样的解析器可以工作:

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

我还想匹配在该定界符之前结束的字符串,所以我希望 foo/barfoo 都返回“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

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

相关文章:

scala - 使用 Scala 解析器组合器在另一个解析器中重用解析器

parsing - 如何在 Nom 中解析大写字符串?

rust - HashMap保留Vec缓冲区和切片到缓冲区

javascript - 如何在编译为WebAssembly的Rust库中使用C库?

rust - 如何在不调用其中一个函数的情况下链接 C 库?

pointers - 如何在 Rust 中传递对可变数据的引用?

rust - 该死的,如果你这样做,该死的,如果你不 : Rust compiler complains regardless whether there's a lifetime parameter or not

scala - 在 Scala 中为解析器组合器 II 创建测试

f# - FParsec:如何从错误消息中省略 `many` 解析器失败

parsing - 使用 nom 根据先前的元素有条件地解析数组