如何使用 nom take_while 和 is_digit 作为 &str 输入

mot*_*son 4 rust nom

我正在尝试学习 nom ,但遇到了take_while不接受is_digit或任何其他is_xxxx.

我想要解析的行看起来像这样

#123 = ABCDEF (...);
Run Code Online (Sandbox Code Playgroud)

我想得到“123”部分(最终还有 ABCDEF 和 (...) 部分。但当时我猜有一件事)。

我的解析器目前看起来像这样

use nom::{
  bytes::complete::take_while,
  character::is_digit,
  error::ParseError,
  IResult
};

// Get row id
fn id<'a, E: ParseError<&'a str>>(i: &'a str) -> IResult<&'a str, &'a str, E> {
    take_while(is_digit)(i)
}
Run Code Online (Sandbox Code Playgroud)

定义is_digit看起来像这样

pub fn is_digit(chr: u8) -> bool
Run Code Online (Sandbox Code Playgroud)

由于id解析器采用 a&str它会抱怨类型不匹配。但是是否有可能以某种方式使用 is_digit 呢?我可以在某处进行类型转换而无需分配任何内容吗?我真的希望它尽可能高效。

感觉提供的is_xxxx函数应该在这种情况下使用,但我可能是错的。

谢谢!

Ste*_*eve 5

我知道它不能直接回答你的问题,因为它不直接使用take_while,但你可以digit1使用character::complete::digit1.

它需要一个&str并消耗 [0..9] 中的 1 个或多个数字并返回一个&str