首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使用nom将带符号的字符串解析为i32?

nom是一个用于解析器组合的Rust库。它提供了一种简洁而强大的方式来定义和组合解析器,以解析各种数据格式。

要使用nom将带符号的字符串解析为i32,可以按照以下步骤进行:

  1. 首先,确保你的Rust项目中已经引入了nom库。可以在Cargo.toml文件中添加以下依赖项:
代码语言:txt
复制
[dependencies]
nom = "6.2.1"
  1. 创建一个新的Rust文件,并在文件开头添加以下代码:
代码语言:txt
复制
use nom::character::complete::{char, digit1};
use nom::combinator::map_res;
use nom::sequence::tuple;
use nom::IResult;

这些代码将引入nom库中的一些常用解析器组合和辅助函数。

  1. 定义一个解析器函数来解析带符号的字符串为i32。可以使用nom提供的解析器组合来构建解析器。以下是一个示例解析器函数的代码:
代码语言:txt
复制
fn parse_signed_int(input: &str) -> IResult<&str, i32> {
    let (input, sign) = char('-')(input)?;
    let (input, digits) = digit1(input)?;
    let parsed_int: Result<i32, _> = digits.parse();
    match parsed_int {
        Ok(value) => {
            if sign == '-' {
                Ok((input, -value))
            } else {
                Ok((input, value))
            }
        }
        Err(_) => Err(nom::Err::Failure((input, nom::error::ErrorKind::Digit))),
    }
}

这个解析器函数首先尝试解析一个负号,然后解析一个或多个数字字符。然后,将解析的数字字符串转换为i32类型,并根据负号的存在确定最终的解析结果。

  1. 在主函数中调用解析器函数并打印结果。以下是一个示例的主函数代码:
代码语言:txt
复制
fn main() {
    let input = "-123";
    match parse_signed_int(input) {
        Ok((_, value)) => println!("Parsed value: {}", value),
        Err(e) => println!("Parsing error: {:?}", e),
    }
}

这个示例将解析输入字符串"-123"并打印解析结果。

总结: 使用nom将带符号的字符串解析为i32的步骤如上所述。nom提供了强大的解析器组合和辅助函数,使解析过程变得简洁而灵活。通过定义适当的解析器函数,可以轻松地解析各种数据格式。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【Rust每周一知】神奇 parse

Rust 中,有一个神奇函数 parse。它定义在 std:str 下面。因为字符串中可以存放各种信息(如果加上序列化的话),对字符串解析就显得特别重要,而且很通用。...把这个字符串切片解析成另外一种类型。 因为解析太普遍了,往往在类型推导时候会产生问题。...因此,parse 是你能看到使用了turbofish语法(::)少数几个场景之一,它帮助推导算法知道你想解析到什么类型上去。...示例一:解析成整数 把字符串解析整数,各种类型。...本文差不多到这里该结束了,高级序列化/反序列化工作,应该交给 Serde 等系列库来解决。更高级解析器什么,就需要 nom 等库出马了。

1.4K20
  • IM通讯协议专题学习(十):初识 Thrift 序列化协议

    1、引言 本文将带你一起初步认识Thrift序列化协议,包括Binary协议、Compact协议(类似于Protobuf)、JSON协议,希望能为你通信协议格式选型带来参考。...《IM通讯协议专题学习(六):手把手教你如何在Android上从零使用Protobuf》 《IM通讯协议专题学习(七):手把手教你如何在NodeJS中从零使用Protobuf》 《IM通讯协议专题学习(...八):金蝶随手记团队Protobuf应用实践(原理篇)》 《IM通讯协议专题学习(九):手把手教你如何在iOS上从零使用Protobuf》 《IM通讯协议专题学习(十):初识 Thrift 序列化协议...以 i32 类型,数值 955 例,可以看出,由原来 4 字节压缩到了 2 字节: binary编码:       00000000  00000000  00000011  10111011 切分...字段被标识 optional 之后: 1)基本类型会被编译为指针类型; 2)序列化代码会做空值判断,如果字段空,则不会被编码。

    18700

    一起学Rust-实战leetcode(六)

    本次实战目的: 字符串字节向量引用使用,类型转换,数字边界处理,字符串取片段,。 简单分析: 题目讲比较清晰。...直接讲一下思路: 将字符串转换为utf8字节类型,那么数字、符号等会转换为对应ascii码,则通过对于单字节数字、符号进行遍历比对。...至于转换为整数至少有两种方法,其一可以使用字符串截取片段来获取一段完整数字,通过 i32::from_str 转换,并可以处理溢出异常。...直接上代码,随后进行解析: fn my_atoi(s: String) -> i32 { // 获取字节数组引用 let bytes = s.as_bytes(); // 字符串截取起始和结束...注意:使用 i32::from_str() 需要引入std::str::FromStr,参数需要传入&str类型。如此获取字符串发生转换异常时则一定是溢出情况。

    70920

    如何不写一行代码把 Mysql json 字符串解析 Elasticsearch 独立字段

    2.2 Json 字段处理方案 2.2.1 方案一:遍历 Mysql,解析Json。 逐行遍历 Mysql,把 Json 字符串字段解析单个字段,更新到Mysql中。...缺点:需要写解析代码,且涉及 Mysql 逐行更新操作,慢且效率低。 2.2.2 方案二:logstash 中间环节用 json filter 插件过滤搞定 Json 串解析。...既然 logstash json filter 插件能做数据解析,那么,与之对标的 Ingest 管道预处理中 json processor 等 processor 组合肯定也能搞定。...将 wb_detail 源字符串 变成 wb_json json串。 wb_json 属于中间过度字段。 processor 2:script 处理。...)分、时、天、月、年,全部*默认含义每分钟都更新 schedule => "* * * * *" } } filter { } output { elasticsearch { #ESIP

    2.8K30

    Rust 中解析器组合因子(Parser combinators)

    正则表示法不“将数据解析数据结构”,他们只接受或拒绝字符串。因此,需要对它们输出,进行额外后续处理。 正则表达式,有着内在问题。对我们来说,这意味着只能使用简短表达。...), } 现在,让我们使用 nom 库(译注:面向字节、零拷贝解析器组合因子库),享受富有表现力、声明式解析。...由于在 v5 中,nom宏 API 非常容易出错,因此我们将使用函数 API。并且,我们已经用 v6 测试过了。 我们将逐行解析命令。...在(B)中,我们使用 nom::branch::alt 组合了三个解析器:add、done 和 search。它尝试从最左边开始,应用这些解析器中每一个,直到一个成功为止。...many1 至少重复一次 digit1 解析才能成功,其中 digit1 是在 nom 库中实现。 现在,在确保我们解析器可以被其他人使用方面,让我们对其理解做以巩固。

    1.9K10

    Google 开源 Python 命令行库:深入 fire(一)

    ,每个函数名隐式就是子命令名称,然后调用 fire.Fire() 变将当前模块所有的函数解析对应子命令处理函数。...,比如上述 add 10 20 中 10 和 20 是作为数字而非字符串,我们会在下篇文章参数解析章节中进行讲解。...字典对象形式 {'子命令名称': 函数},比如前面的示例中,我们希望最终子命令 add 和 mul,那么就可以这么写: fire.Fire({ 'add': add, 'mul': multiply...__init__(self, offset=1) 中 offset 自动转换为了命令行中全局选项参数 --offset,且默认值 1。...在下篇文章中,我们将进一步深入了解 fire,介绍其链式函数调用、自定义序列化、参数解析、fire 选项等更加高阶功能。

    70720

    深入剖析 iOS 编译 Clang LLVM

    标识符:变量名 字面量:值,数字,字符串 特殊符号:加减乘除等符号 通过下面的命令可以输出所有 token 和所在文件具体位置,命令如下。...The Sema Library - 解析器调用此库时,会对输入进行语义分析。 对于有效程序,Sema 解析构造一个 AST。...用先前 Mach-O 章节例子继续分析,每个函数,全局变量和类都是通过符号形式来定义和使用,当把目标文件链接成一个执行文件时,链接器在目标文件和动态库之间对符号解析处理。...链接器通过动态库解析符号会记录是通过哪个动态库解析,路径也会一起记录。对比下 a.out 符号表看看是怎么解析符号。...基于非常简单原始栈 kernel 设置进程来启动自身。 使用共享缓存来处理递归依赖带来性能问题,ImageLoader 会读取二进制文件,其中包含了我们类,方法等各种符号

    7.8K20

    【Rust 视界】toml-edit 优化之旅

    使用 kstring[3] ,来优化字符串key。...默认情况下,kstring : 内联字符串存储总共 16个字节 max_inline 特性选择存储总共 23 个字节,对于小字符串来说会很慢 以Box形式存储堆字符串 使用Arc,它用Ref-counting...要注意第三方解析便利性背后成本 解析器组合器,如nom或combined,使语法转换为代码变得容易,但也很容易隐藏大量成本: 不必要分配 缺少批处理 他优化解析 https://github.com...作者要优化他还有很多选择,比如放弃 combine,使用nom或者手写parse (性能优化效果将最大),但是他选择继续使用 combine,但是用 dispatch!...这样选择算是小步迈进。PR[5] 7. serde隐藏成本 serde对toml文件中每个字符串进行解析,看它是否可能是一个日期。没有Datetime文件必须存在付出代价。

    67220

    教程 | 编译器入门:没有siri那些年,我们如何实现人机对话?

    LLVM IR 是一种类似汇编低级语言。但是,它不针对特定硬件信息编程。 你好,编译器 下面是一个简单打印「Hello,Compiler」字符串 C 语言程序。...每个词或符号,按其属性被分配到对应句法类别:标点符号、关键词、标识符、常量或注释。 compile_me.c 词法分析: ? 解析器判定由词法分析器生成一串词是否包含源语言中有效语句。...在分析完词语法以后,解析器输出了一个抽象语法树(AST)。Clang AST 中节点分别表示声明与类型。 compile_me.c AST: ?...优化器 优化器任务是基于对程序运行时行为理解,提升代码效率。优化器输入 IR,输出优化后 IR。...我 CPU 是 x86 架构,也就是说只能使用 16 个寄存器。但是,编译器会尽可能少地使用寄存器。

    1.2K60

    Rust入坑指南:千人千构

    : &Rectangle,至于这里为什么要使用&符号,我们在前文已经做了介绍。...当然,这里self也不是必须要加&符号,你可以认为它是一个正常参数,根据需要来使用。 有些同学可能会有些困惑,我们已经有了函数了,为什么还要使用方法?这其实主要是为了代码结构。...调用时直接使用双冒号(::),我们之前见过很多次String::from("Hi")就是String相关函数。 最后提一点,Rust支持一个Struct定义多个实现代码块。...因此枚举对于大部分开发人员来说并不陌生,这里我们简单介绍一些使用方法及特性。 先来看一下Rust中如何定义枚举和获取枚举值。...首先匹配一系列模式,然后执行相应代码。与Java中switch不同是,switch只能支持数值/枚举类型(现在也可以支持字符串),match可以支持任意类型。

    68730

    llvm入门教程-Kaleidoscope前端-7-可变变量

    在第1章到第6章中,我们已经构建了一个非常值得尊敬函数式编程语言.]。在我们旅程中,我们学习了一些解析技术,如何构建和表示一个AST,如何构建LLVMIR,以及如何优化结果代码和即时编译它。...考虑到这一点,高级想法是我们希望函数中每个可变对象创建一个堆栈变量(它驻留在内存中,因为它在堆栈上)。要利用此技巧,我们需要讨论LLVM如何表示堆栈变量。...请注意,即使变量定义I32”,\@G/\@H全局变量类型实际上也是“I32*”。这意味着,\@G在全局数据区域中I32定义了空间,但它名字实际上是指该空间地址。...此代码显示了如何在LLVM IR中声明和操作堆栈变量示例。使用alloca指令分配堆栈内存是完全通用:您可以将堆栈槽地址传递给函数,也可以将其存储在其他变量中,依此类推。...现在所有符号表引用都更新使用堆栈变量,我们将添加赋值运算符。 新建赋值运算符 使用我们当前框架,添加一个新赋值操作符非常简单。

    1.6K10

    【Rust日报】2022-01-10 使用 Nom 解析文本

    使用 Nom 解析文本 本教程是关于 Nom ,它是我最喜欢Rust解析库。它使用解析器组合子方法:开始编写匹配单个数字或字符小型解析器。...这些将成为更大解析构建块,用于匹配,比如日期或电话号码。通过将许多小型解析器组合在一起,您可以构建一个大型解析器,将文件或流解码漂亮Rust结构和枚举。...在本教程中,我们将使用Nom解析输入文件到一个Advent of Code谜题。...原文链接: https://blog.adamchalmers.com/nom-chars/ Bevy是如何使用 Rust traits 来添加标签 出于好奇,作者最近开始关注Bevy开发,Bevy...今天作者想谈谈Bevy如何使用Rust特性让用户非常方便地元素添加标签。

    81220

    WebAssembly简介

    这是存储器任务,假设我们调用函数是一个只包含字符串存储器地址参数,比如function (addr i32) :void。...我们现在可以使用字符串地址(4)调用函数: i32.const 4 // 字节偏移作为参数传递到内存中... call 1 // 调用接收函数 接收函数将从内存中加载所需字符串任何部分...如果我们意图是将i32值加载等效f32数字,那么我们使用一个数字转换运算符作为目标类型: i32.const 4 // address-operand = 4 i32.load 2 4...浮点数总是“有符号”,但整数可以无符号。 “但是,我们在本文一直在使用i32,并没有看到任何符号特定运算符!”...我们目前使用大多数运算符只需要知道数据大小,并不在乎该值是否被解释符号或无符号。 WebAssembly整数值基本上未知符号 。 当然有几个操作需要知道它操作数是有符号还是无符号

    1.4K30

    Rust生态安全漏洞总结系列 | Part 2

    因此,我们依赖于这些归零位,但值类型仍然是I32,并且溢出/重新加载将这些比特位重构I32MSB符号扩展。 所以,在某些特定情况下,如果i32指针,则可能会出现沙箱逃逸情况。...parse_duration 库用来将字符串解析持续时间(duration)。...,允许使用指数级持续时间字符串解析,其中BigInt 类型与 pow 功能一起用于这类 Payload。...创建预编译语句 sqlite3_close() Diesel by_name 查询通用做法是将预编译语句所有字段名称保存为字符串切片以备以后使用。...但是sqlite行为是: 返回字符串指针一直有效,直到准备好语句被 sqlite3_finalize() 销毁, 或者直到第一次调用 sqlite3_step() 特定运行自动重新预编译该语句,

    79470

    【Rust日报】2021-08-23 UltraOS获第一届全国大学生操作系统比赛一等奖

    UltraOS获第一届全国大学生操作系统比赛一等奖 2021第一届全国大学生操作系统比赛比赛结果公布了,哈工大(深圳)李程浩,宫浩辰,任翔宇获得了内核实现赛道一等奖,指导教师夏文老师和江仲鸣老师...项目使用了洛佳等开发者RustSBI 2021.03.26版本,以及吴一凡等开发者rCoreTutorial-v3 2021.03.26版本(清华大学计算机系2021 OS课实验指导教程)。...这也说明了,基于开源社区模式,采用Rust开发操作系统等系统软件是Rust语言一种发展趋势。 nom: 7.0 发布了 nom是一个用Rust编写解析组合器库。...它目标是提供构建安全解析工具,而不影响速度或内存消耗。为此,它广泛使用Rust强类型和内存安全来生成快速和正确解析器,并提供函数、宏和特征来抽象大多数容易出错管道。...现在最新7.0版本已经发布. crate.io 地址:https://crates.io/crates/nom 如何组织大型 Rust workspace 在本文中,作者分享了自己组织大型Rust项目的经验

    54620
    领券