使用 Nom 5 解析带有转义引号的单引号字符串

2024-03-18

我是 Rust 和 Nom 的新手,我正在尝试解析可能包含转义引号的(单)引号字符串,例如'foo\' ???? bar' or 'λx → x', '' or ' '.

我找到了escaped!宏,其文档 https://docs.rs/nom/5.0.1/nom/macro.escaped.html says:

第一个参数匹配普通字符(它不能接受控制字符),第二个参数是控制字符(如大多数语言中的 \),第三个参数匹配转义字符

由于我想在匹配器中匹配除反斜杠以外的任何内容来匹配“普通字符”,因此我尝试使用take_till! https://docs.rs/nom/5.0.1/nom/macro.take_till.html:

    named!(till_backslash<&str, &str>, take_till!(|ch| ch == '\\'));
    named!(esc<&str, &str>, escaped!(call!(till_backslash), '\\', one_of!("'n\\")));

    let (input, _) = nom::character::complete::char('\'')(input)?;
    let (input, value) = esc(input)?;
    let (input, _) = nom::character::complete::char('\'')(input)?;

    // … use `value`

然而,当尝试解析时'x',这返回Err(Incomplete(Size(1)))。当搜索这个时,人们通常建议使用CompleteStr,但这不在Nom 5中。解决这个问题的正确方法是什么?


当在所谓的流模式下运行时,nom可能会返回Incomplete表明它无法做出决定并且需要更多数据。这nom4 介绍CompleteStr。旁边还有CompleteByteSlice,它们是完整的输入对应物&str and &[u8]。解析器将它们作为完整模式下的输入工作。

他们走了进去nom 5. In nom5,正如您所观察到的,基于宏的解析器始终以流模式工作。对于在流式传输和完整模式下工作不同的解析器组合器,它们在单独的子模块中有不同的版本,例如nom::bytes::streaming and nom::bytes::complete.

对于所有这些血淋淋的细节,你可能想查看一下这篇博文 http://unhandledexpression.com/general/2019/06/17/nom-5-is-here.html,尤其是该部分流式解析器 VS 完整解析器.

此外,函数组合器比宏组合器更受青睐nom5. 这是一种方法:

//# nom = "5.0.1"
use nom::{
    branch::alt,
    bytes::complete::{escaped, tag},
    character::complete::none_of,
    sequence::delimited,
    IResult,
};

fn main() {
    let (_, res) = parse_quoted(r#"'foo\' ???? bar'"#).unwrap();
    assert_eq!(res, r#"foo\' ???? bar"#);
    let (_, res) = parse_quoted("'λx → x'").unwrap();
    assert_eq!(res, "λx → x");
    let (_, res) = parse_quoted("'  '").unwrap();
    assert_eq!(res, "  ");
    let (_, res) = parse_quoted("''").unwrap();
    assert_eq!(res, "");
}

fn parse_quoted(input: &str) -> IResult<&str, &str> {
    let esc = escaped(none_of("\\\'"), '\\', tag("'"));
    let esc_or_empty = alt((esc, tag("")));
    let res = delimited(tag("'"), esc_or_empty, tag("'"))(input)?;

    Ok(res)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Nom 5 解析带有转义引号的单引号字符串 的相关文章

随机推荐

  • Django ORM - .update(...) 以及 extra(...) 和 F(...)

    我想做一个 sql 查询来更新 Django 站点中的许多模型 我想更改一个字符列 字段以基于 id 和一些文本 在 MySQL 这个站点就是 中 我会这样做 UPDATE table SET blah prefix id suffix 我
  • C# (.NET) 中是否有更好的 Web 浏览器控件?

    我需要 JavaScript 在我的应用程序中几乎完美地工作 应该能够访问 Web 内容并让用户控制它 但是 webbrowser 组件会在 Internet Explorer 的单独实例 应用程序中弹出新窗口 并且 dotBrowser
  • 整合 ASP.NET MVC 控制器依赖关系 (StructureMap)

    我正在查看我网站中的控制器 它们的大多数构造函数如下所示 public SomeController IServiceOne serviceOne IServiceTwo serviceTwo ILoggingService logging
  • 在 Kafka 中设计生产者和消费者组件

    我在用Kafka and Zookeeper作为我的数据管道的主要组件 该管道每秒处理数千个请求 我在用Samza作为我需要对数据进行小型转换的实时数据处理工具 我的问题是我的一位消费者 比方说ConsumerA 消耗了几个主题Kafka并
  • 创建多个 csv 文件并使用 Rails 将所有内容下载到一个 zip 存档中

    我正在寻找一种方法来创建多个 csv 文件 并在 Rails 应用程序的一个请求中将它们作为一个 zip 存档下载 为了构建存档 我使用 ruby zip gem 只需使用 Rails 内置函数 send data 即可下载它 我遇到的问题
  • 如何在 Android Studio 中导入 dropbox Chooser SDK?

    https www dropbox com developers dropins chooser android https www dropbox com developers dropins chooser android 我正在尝试在
  • 修改Robot Framework中的列表列表

    我有一个在机器人框架中使用的嵌套列表 我想更改机器人框架级别的子列表中的一项 我的清单如下所示 鲍勃 玛丽 六月 七月 八月 我想将 七月 更改为其他名称 例如 九月 机器人框架将允许我更改 bob 或 mary 但如果我尝试插入列表 它会
  • 我们可以从worker/minion节点运行kubectl吗?

    我有 kubernetes 集群设置 我想检查工作程序 minion 节点中的节点 我们可以从工作程序 minion 节点运行 kubectl 吗 是的 您只需要拥有正确的客户端凭据 就可以从可以通过网络访问 apiserver 的任何地方
  • Windows 登录集成

    我正在出于某种目的构建面部识别软件 但是 作为衍生产品 我想使用相同的软件 概念 当我坐在电脑前时自动识别我并登录 处理识别 但是 我需要将其合并到 Windows 中 就像指纹登录的工作方式一样 我可以去哪里获取有关执行此操作的更多信息
  • 使用 wicked_pdf 从生成的 PDF 生成 ZIP

    在我的发票系统中 我需要一个备份功能来一次性下载所有发票到一个 zip 文件中 该系统在 Heroku 上运行 因此只能临时保存 pdf 我安装了 ruby zip 和 wicked pdf gem 我当前在控制器中的代码 def zip
  • 垃圾收集线程太多

    我正在用java开发一个软件 它在接收到事件 来自传感器 时创建一个线程 这些线程的生存时间非常短 传感器发送最多 10 个事件 分钟 这个应用程序在大多数情况下都运行良好 但有时它会挂起 当查看 eclipse 调试器时 我发现有很多线程
  • 你怎么知道用 malloc() 分配多少空间?

    我是一个完全的 C 新手 我来自 C 我一直在学习内存管理和malloc 功能 我也遇到过这段代码 char a persons name malloc sizeof char 2 我不明白这是分配了多少空间a persons name 是
  • Excel更改条件格式公式

    我有一个表 其中包含许多代表时间线的单元格 每分钟一个单元格 宽度非常小 我想在该表中可视化包含三个阶段的操作 一条线上可以有多个手术 代表一个手术室 例如 如果准备工作在 10 00 开始 实际操作在 10 23 开始 则这些时间之间的所
  • 如何使用GVIM编辑远程文件?

    我在 Ubuntu 9 10 上使用 GVIM 我正在寻找正确的方法来配置 GVIM 以便能够通过 ftp 等方式编辑远程文件 HTML PHP CSS 当我使用 e scp username remotehost path to file
  • 将数据表导出到 Excel [重复]

    这个问题在这里已经有答案了 可能的重复 如何在C 中将DataTable导出到Excel https stackoverflow com questions 8207869 how to export datatable to excel
  • Mongoose 使用多个参数搜索 FindOne

    我第一次尝试使用 Angular Express mongodb 构建一些东西 所以我可能会以完全错误的方式进行处理 Express 用于提供 json 然后 Angular 会处理所有视图等 我正在使用 Mongoose 与 Mongo
  • Python运行系统命令然后退出...不会退出

    我有以下 python 代码 os system C Python27 python exe C GUI TestGUI py sys exit 0 它运行命令正常 并弹出一个窗口 但是 它不会退出第一个脚本 它就留在那里 我最终不得不强制
  • 如何使用带标签的 AWS Cli 过滤 Lambda?

    所以我知道我可以通过此命令以文本 csv 形式获取所有 lambda 函数 aws lambda list functions region us east 1 query Functions FunctionName output tex
  • 如何获取带视频 ID 的 YouTube 视频描述?

    我目前正在使用 youtube 的 Javascript API 在我的网页上显示视频 但是现在我还想从视频 ID 中检索 youtube 描述 我该怎么做呢 我只想要描述和标题 ex kind youtube video etag eta
  • 使用 Nom 5 解析带有转义引号的单引号字符串

    我是 Rust 和 Nom 的新手 我正在尝试解析可能包含转义引号的 单 引号字符串 例如 foo bar or x x or 我找到了escaped 宏 其文档 https docs rs nom 5 0 1 nom macro esca