首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用nom捕获整个连续匹配的输入

用nom捕获整个连续匹配的输入
EN

Stack Overflow用户
提问于 2016-03-30 05:25:58
回答 1查看 883关注 0票数 6

我希望应用一系列诺姆解析器,并返回匹配的完整&str。我想要匹配表单a+bc+的字符串。使用现有的,我可以非常接近:

代码语言:javascript
复制
named!(aaabccc <&[u8], &str>,
   map_res!(
       chain!(
           a: take_while!(is_a) ~
               tag!("b") ~
               take_while!(is_c) ,
           || {a}
           ),
       from_utf8
   ));

哪里

代码语言:javascript
复制
fn is_a(l: u8) -> bool {
   match l {
       b'a' => true,
       _ => false,
   }
}

fn is_c(l: u8) -> bool {
    match l {
        b'c' => true,
        _ => false,
    }
}

假设我们有'aaabccc‘作为输入。上面的解析器将与输入匹配,但只返回'aaa‘。我想做的是返回'aaabccc',原始输入。

chain!不是正确的宏,但是没有一个更正确的宏。做这件事最好的方法是什么?

在撰写本文时,我使用的是nom 1.2.2和rustc 1.9.0-nightly (a1e29daf1 2016-03-25)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-30 12:50:29

似乎你想要recognized!

如果子解析器成功,则将消耗的输入作为产生的值返回。

还有一个例子:

代码语言:javascript
复制
#[macro_use]
extern crate nom;

use nom::IResult;

fn main() {
    assert_eq!(aaabccc(b"aaabcccddd"), IResult::Done(&b"ddd"[..], "aaabccc"));
}

named!(aaabccc <&[u8], &str>,
   map_res!(
       recognize!(
           chain!(
               take_while!(is_a) ~
               tag!("b") ~
               take_while!(is_c),
               || {}
           )
       ),
       std::str::from_utf8
   )
);

fn is_a(l: u8) -> bool {
   match l {
       b'a' => true,
       _ => false,
   }
}

fn is_c(l: u8) -> bool {
    match l {
        b'c' => true,
        _ => false,
    }
}

如果您不关心这些值,我不确定chain!是否是组合顺序解析器的最佳方法,但在这种情况下,它是有效的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36300373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档