我正在学习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
函数应该用于这类情况,但我可能错了。
谢谢!
3条答案
按热度按时间vtwuwzda1#
您可以轻松地将
is_digit
转换为char
。首先,所有数字都是有效的ASCII,因此我们应该首先检查字符是否为ASCII。如果是ASCII,则可以安全地转换为u8
。您还可以使用trait方法is_dec_digit,它只是www.example.com _digit的一个 Package 器char.is。
mwg9r5ms2#
我知道它没有直接回答你的问题,因为它没有直接使用
take_while
,但是你可以在character::complete::digit1
中使用digit1
解析器。它接受一个
&str
,并使用[0..9]中的一位或多位数,然后返回一个&str
wlwcrazw3#
使用nom AsChar trait的最新解决方案: