gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:17:34 24 4
gpt4 key购买 nike

我正在尝试学习 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 函数应该在这些情况下使用,但我可能错了。

谢谢!

最佳答案

您可以轻松地将 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)
}

您还可以使用特征方法 is_dec_digit ,这只是 char.is_digit 的包装器.

关于rust - 如何将 nom take_while 和 is_digit 用于 &str 输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57812043/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com