- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 Nom 6.1.2 来解析一个相对简单的 Lisp 之类的语言,我需要捕获形式为 [a-z][a-zA-Z0-9_\-\.]
的标识符。 .我尝试使用 re_match
但这是期待整个input
不只是匹配字符串的第一部分。我希望能够将这些标识符作为更大上下文的一部分进行匹配,因此我希望它以解析器组合器的方式返回要传递给其他解析器的输入的其余部分。
fn name(input: &str) -> IResult<&str, &str, VerboseError<&str>> {
let re = Regex::new(r"^[A-Za-z][a-zA-Z0-9_\.\-]*$").unwrap();
context("name", re_match(re))(input)
}
我希望通过的测试如下:
#[test]
fn test_name() {
assert_eq!(name("test"), Ok(("", "test")));
assert_eq!(name("test1-test2"), Ok(("", "test1-test2")));
assert_eq!(name("test1.test2"), Ok(("", "test1.test2")));
assert_eq!(name("test1_test2"), Ok(("", "test1_test2")));
assert_eq!(name("Test1_Test2"), Ok(("", "Test1_Test2")));
assert!(name("123Test").is_err());
//this last assertion fails
assert_eq!(name("test1 test2$!%"), Ok((" test2$!%", "test1")));
}
上述测试中的最后一个断言失败。
thread 'parser::tests::test_name' panicked at 'assertion failed: `(left == right)`
left: `Err(Error(VerboseError { errors: [("test1 test2$!%", Nom(RegexpMatch)), ("test1 test2$!%", Context("name"))] }))`,
right: `Ok((" test2$!%", "test1"))`', src\parser.rs:69:9
stack backtrace:
如果我使用类似
alphanumeric
的东西函数这可以正常工作,但这不能捕获我想要的正则表达式。
最佳答案
我试过了,部分问题在于正则表达式末尾的 $ 。这将告诉正则表达式匹配器匹配整个输入直到结束,否则将不匹配。
另一个问题是 re_match()。从 nom 文档中,如果找到匹配项, re_match 将返回整个输入(无论匹配多少个字符)。您想要的是 re_find() 函数,它将返回第一个匹配项。
关于regex - 如何匹配正则表达式但在 Rust Nom 中返回输入的剩余部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66660450/
鉴于吃掉异常总是糟糕的 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
我是一名优秀的程序员,十分优秀!