- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想通过nom库解析四种形式的YMD日期(“20190919”、“2019.09.19”、“2019-09-19”和“2019/09/19”) .
我从 iso8601 开始仅解析“YYYY-MM-DD”形式的解析器。我尝试匹配分隔符并将其重新用于下一次匹配,就像在正则表达式 (\d{4})([.-/]?)(\d{2})\2(\d{2}) 中一样.
原来这段代码有效:
fn parse_ymd(i: &[u8]) -> IResult<&[u8], DateType> {
let (i, y) = year(i)?;
// Match separator if it exist.
let (i, sep) = opt(one_of(".-/"))(i)?;
let (i, m) = month(i)?;
// If first separator was matched then try to find next one.
let (i, _) = if let Some(sep) = sep {
tag(&[sep as u8])(i)?
} else {
// Support the same signature as previous branch.
(i, &[' ' as u8][..])
};
let (i, d) = day(i)?;
Ok((
i,
DateType::YMD {
year: y,
month: m,
day: d,
},
))
}
但显然它看起来很奇怪。
是否有一些 nom 工具可以更合适地做到这一点?
(这个问题关于nom 功能,以及如何正确地做事。不只是关于这个特定的例子。)
最佳答案
您的解决方案足够不错。我真的只能提供一个建议:
fn parse_ymd(i: &[u8]) -> IResult<&[u8], DateType> {
...
// If first separator was matched then try to find next one.
let i = match sep {
Some(sep) => tag(&[sep as u8])(i)?.0,
_ => i,
};
...
}
您可能不熟悉直接访问元组元素的语法。来自 rust book :
In addition to destructuring through pattern matching, we can access a tuple element directly by using a period (.) followed by the index of the value we want to access.
在这种情况下,它可以避免尝试匹配两个 ARM 的签名的尴尬。
关于regex - 如何通过 nom 解析匹配的分隔符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58011745/
鉴于吃掉异常总是糟糕的 juju 并且重新抛出异常会丢失调用堆栈,重构以下内容的正确方法是什么? 饮食异常(exception): try { … do something meaningful
我尝试为 PanierModel 的属性赋值,但在图片上收到此错误 NoSuchMethodError:在 null 上调用 getter 'nom'。接收者; null 尝试调用:nom class
我正在尝试使用 nom5.0 解析以下备用字符串 "A-Za-z0-9" 或 "A-Z|a-z|0-9" 我尝试了以下但无济于事 pub enum Node { Range(Vec), } f
我想将像 "ParseThis" 或 "parseThis" 这样的字符串解析成像 ["Parse", "This"], map_res!( take_till!(
我有这个使用 nom 4.2.2 的 Rust 程序。 (我冒昧地扩展了 nom 解析器功能。) extern crate failure; extern crate nom; use failure
tl;dr:我正在努力寻找需要使用 nom 进行前瞻的文本解析器的文档或示例。 长版 我正在使用 nom 来解析 6502 程序集。我正在努力创建一个可以解析各种寻址模式的解析器。任何给定的操作码都将
我试图使用nom::bits::bits从&[u8]向量中提取7位,但是我发现剩余数据不正确,似乎它必须是4/8的整数倍,但我不是当然。 像这样的一些代码(标称值= 5.12): fn take_7_
我正在尝试为一种简单的查询语言实现一个解析器。目标是从文本生成操作,然后在将它们向上传递到树之前评估它们。如果我理解正确,我将不得不实现一些 nom 特征(InputLength、InputTake、
我正在尝试编写一个识别多行注释的 nom 解析器... /* yo! */ ...并消耗/丢弃(同样的事情,对吧?)结果: use nom::{ bytes::complete::{tag, ta
我想通过nom库解析四种形式的YMD日期(“20190919”、“2019.09.19”、“2019-09-19”和“2019/09/19”) . 我从 iso8601 开始仅解析“YYYY-MM-D
我正在学习 nom,作为一个测试示例,我正在尝试解析字符串直到出现分隔符。如果我的定界符是 /,那么我想匹配该定界符之前的所有内容。为此,像这样的解析器可以工作: named!(gobbledygoo
我正在开发一个模板引擎,其中一些语法可能是这样的: {{ somevar|filter }} 代替 somevar 可以是任意“表达式”,也就是说,可以是像 somevar 这样的变量名,也可以是嵌套
我在 nom 中编写了一个完全无状态的解析器,现在我需要将它包装在几个有状态的层中。 我有一个名为 alt_fn 的顶级解析函数这将为我提供下一个解析输出作为枚举变体,其细节可能并不重要。 我需要做三
我正在尝试使用 nom 创建一个解析器,它将解析一些可能是许多选项之一的文本。名称有 alt!因为当值在编译时已知,但我的值不会。 这是我尝试创建自己的解析器,它可以接受 Vec匹配,我遇到了几个问题
我是 Rust 的新手,三个小时以来我一直在努力思考这个问题,我想我快要疯了。我想要的只是一个接受字符串 "true" 并返回枚举 Value::Const(true) 的解析器。这是我目前所拥有的:
我需要从一个 u8 数组中解析一个 32 位整数数组(小端),但是下一个整数只有在当前整数的第 31 位被设置时才存在。如果其余部分不存在,则应将数组的其余部分设置为零。我不确定如何有条件地解析下一个
我想用 nom 恰好匹配一个字母字符 (a-zA-Z)。 我知道我可以使用 take_while! 贪婪地匹配这样的东西: // match one or more alphabetical char
我已经在 nom 中创建了一些重要的解析器,所以我现在对它非常熟悉。到目前为止,我创建的所有解析器始终将整个输入切片提供给解析器。 我想创建一个流解析器,我假设这意味着我可以继续将字节输入解析器,直到
我正在尝试使用 nom 解析一个字符串,该字符串要么被换行符终止,要么在使用后到达输入末尾。我有以下似乎应该编译的代码: named!(am_implied , do_parse!(
我正在使用 nom解析一些二进制 65c816 汇编数据。我的解析器结构的一部分将操作码拆分为单独的形式,然后获取它们的参数(如果有的话)。一个示例解析器目前看起来像这样: named!(absolu
我是一名优秀的程序员,十分优秀!