rust 如何将nom take_while和is_digit用于&str输入

kkbh8khc  于 2023-03-08  发布在  Git
关注(0)|答案(3)|浏览(145)

我正在学习nom,但遇到了take_while不接受is_digit或任何其他is_xxxx的问题。
我想要解析的行如下所示

#123 = ABCDEF (...);

在那里我想得到"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)
}

is_digit定义如下所示

pub fn is_digit(chr: u8) -> bool

由于id解析器接受了&str,它会抱怨类型不匹配。但是有没有可能使用is_digit呢?我可以在某个地方进行类型转换而不必分配任何东西吗?我真的希望这尽可能高效。
似乎提供的is_xxxx函数应该用于这类情况,但我可能错了。
谢谢!

vtwuwzda

vtwuwzda1#

您可以轻松地将is_digit转换为char。首先,所有数字都是有效的ASCII,因此我们应该首先检查字符是否为ASCII。如果是ASCII,则可以安全地转换为u8

// pub fn is_digit(chr: u8) -> bool;

pub fn is_char_digit(chr: char) -> bool {
    return chr.is_ascii() && is_digit(chr as u8)
}

您还可以使用trait方法is_dec_digit,它只是www.example.com _digit的一个 Package 器char.is。

mwg9r5ms

mwg9r5ms2#

我知道它没有直接回答你的问题,因为它没有直接使用take_while,但是你可以在character::complete::digit1中使用digit1解析器。
它接受一个&str,并使用[0..9]中的一位或多位数,然后返回一个&str

wlwcrazw

wlwcrazw3#

使用nom AsChar trait的最新解决方案:

take_while1(AsChar::is_dec_digit)(input)

相关问题