作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试熟悉 Nom,目前是第 5 版,其中没有 CompleteStr
和其他内容,因此相关问题不是很有帮助。
我怎样才能解析类似的东西
"@pook Some free text @another_pook And another text"
进入
vec![("pook", "Some free text"), ("another_pook", "And another text")]
?
@
前缀的字符串称为“字段标识符”;下一个子串是描述;都叫“场”
下面是我如何成功解析一个字段:
use nom::bytes::complete::take_while1;
use nom::*;
use nom::character::is_alphabetic;
fn ident(c: char) -> bool {
is_alphabetic(c as u8) || c == '_'
}
fn freetext(c: char) -> bool {
c != '@'
}
fn parse_ident(s: &str) -> IResult<&str, &str> {
take_while1(ident)(s)
}
fn parse_freetext(s: &str) -> IResult<&str, &str> {
take_while1(freetext)(s)
}
named! {field_ident<&str, &str>,
do_parse!(
tag!("@") >>
name: parse_ident >>
(name)
)
}
named! { field <&str, (&str, &str)>,
do_parse!(
name: ws!(field_ident) >>
description: parse_freetext >>
(name, description)
)
}
当我将它包装到 many1
中并按照开头所述提供输入时,我收到了 Err(Incomplete(Size(1)))
,但如果我输入它,它就会工作@
在输入的末尾。如何在输入结束时将其标记为已完成?
最佳答案
您需要 many_till
组合器,而不是 many1
,如下所示:
use nom::bytes::complete::take_while1;
use nom::character::is_alphabetic;
use nom::*;
fn ident(c: char) -> bool {
is_alphabetic(c as u8) || c == '_'
}
fn freetext(c: char) -> bool {
c != '@'
}
fn parse_ident(s: &str) -> IResult<&str, &str> {
take_while1(ident)(s)
}
fn parse_freetext(s: &str) -> IResult<&str, &str> {
take_while1(freetext)(s)
}
named! {field_ident<&str, &str>,
do_parse!(
tag!("@") >>
name: parse_ident >>
(name)
)
}
named! { field <&str, (&str, &str)>,
do_parse!(
name: ws!(field_ident) >>
description: parse_freetext >>
(name, description)
)
}
named!(fields<&str, (Vec<(&str, &str)>, &str)>, many_till!(field, eof!()));
fn main() {
println!("{:?}", field("@pook Some free text"));
println!(
"{:?}",
fields("@pook Some free text @another_pook And another text")
);
}
相当反直觉。我猜这与 nom
的流媒体特性有关。
关于 rust 标称 : many and end of input,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57608442/
我正在尝试熟悉 Nom,目前是第 5 版,其中没有 CompleteStr 和其他内容,因此相关问题不是很有帮助。 我怎样才能解析类似的东西 "@pook Some free text @anothe
假设我想创建一个多次使用另一个解析器的组合器,例如,解析由两种引号分隔的字符串: fn quoted>(f: F) -> impl Fn(&'a str) -> IResult where F
我是一名优秀的程序员,十分优秀!