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

如何匹配正则表达式,但返回Rust Nom中输入的剩余部分?

在Rust中,可以使用正则表达式库nom来匹配正则表达式,并返回剩余部分。nom是一个用于解析和生成数据的库,它提供了一种声明式的方式来定义解析器。

要使用nom进行正则表达式匹配并返回剩余部分,可以按照以下步骤进行:

  1. 首先,确保你的Rust项目中已经添加了nom库的依赖。可以在Cargo.toml文件中添加如下内容:
代码语言:txt
复制
[dependencies]
nom = "6.2.1"
  1. 在代码中引入nom库:
代码语言:txt
复制
use nom::{
    bytes::complete::take_while,
    character::complete::char,
    sequence::tuple,
    IResult,
};
  1. 定义一个解析器函数,用于匹配正则表达式并返回剩余部分。例如,假设我们要匹配一个由字母和数字组成的字符串,并返回剩余部分:
代码语言:txt
复制
fn parse_input(input: &str) -> IResult<&str, &str> {
    tuple((take_while(|c: char| c.is_alphanumeric()), take_while(|c: char| !c.is_alphanumeric())))(input)
}

在上述代码中,我们使用了take_while函数来匹配字母和数字,char函数来匹配非字母和数字字符。tuple函数用于将两个解析器组合起来,以便同时匹配字母和数字以及非字母和数字字符。

  1. 调用解析器函数并处理结果。例如:
代码语言:txt
复制
fn main() {
    let input = "abc123xyz";
    match parse_input(input) {
        Ok((remaining, result)) => {
            println!("Matched: {}", result);
            println!("Remaining: {}", remaining);
        }
        Err(e) => println!("Error: {:?}", e),
    }
}

在上述代码中,我们将输入字符串传递给解析器函数parse_input。如果匹配成功,我们将打印匹配结果和剩余部分。如果匹配失败,我们将打印错误信息。

这样,你就可以使用nom库来匹配正则表达式,并返回Rust Nom中输入的剩余部分。请注意,以上代码仅为示例,实际使用时可能需要根据具体需求进行调整。

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

相关·内容

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

这些“较小”解析器组件,以后可以在“更大”解析器中用作组件。 完整地解析,意味着输入数据将被完全使用。如果输入数据可能偏差或错误,开发者应在实现解析器对其进行编码,而不是调整输入数据。...没有转换状态,对任何输入都“视觉增强”。(@\* 将字符 '(' 与任何堆栈状态匹配;仅当堆栈为空时,ε@ε 在自动机到达 p 状态时即刻匹配。...\-]*)$ 许多人都能从表面上理解这个正则表达式。似乎,这个正则表达式与链接有关,即使我们求助于正则自动化诠释(译注:一个正则表达式解释和测试站点),事情也没有变得更清楚。...它忽略解析(B),只保留(C)输出。(B)仍将接受输入!一般来说,它将两个计算组合成一个组合器,组合器将运行两个计算,返回第二个计算结果。这和按顺序运行它们,是不一样。...其中 rest 是要解析剩余输入,value 是解析器输出结果。您可以看到(A) preceded 解析,遵循了完全相同模式。 下面的部分,是一些更高级解析器。

1.9K10

再探 Parser 和 Parser Combinator

于是,这个周末,我花了一个晚上,尝试了用 Rust PEG 解析器 — pest 重新实现了 policy 表达式解析器部分,为了更好地对比 pest 和 Rust另外一个神器 nom 效果...当 logic_op 运行完之后,它会 吃掉 输入从头开始任何空白字符,以及随后 and/or,以及之后任意空白字符,然后返回 input 剩下部分,以及匹配 and/or。...separated_ist1 里第二个参数 string 是一个 combinator,用于匹配输入带引号字符串。...优化 nom 后来我发现在对解析出来表达式求值时,在 pest 里,我采用了一些提前返回策略,比如在某个子表达式,如果遇到 true or expr ,我会直接返回 true,略过后一个 expr...这样,如果我们用 rust / nom / sled 重新实现一下 4 年前我做 policy engine,将其集成到 Elixir ,可以达到 5 倍左右性能提升。

2.4K10
  • 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

    Rust 视界周刊 Week 6 | 黑莓公司宣布:汽车行业需要 Rust

    它们并行存在,并且是大部分独立实体,具有大部分独立责任领域,尽管有几个人在两者中都扮演着角色。到目前为止,据我所知,他们之间没有发生任何严重冲突,我也不太清楚如果有会发生什么。...作者认为,Rust 犯了与 C++17 [[nodiscard]]属性相同错误,他认为: 大多数返回函数,无论它们是否有副作用,都应该以某种方式使用它们返回值 一些返回值和有副作用函数可能在不检查返回情况下被正确使用...探讨如何使用 Rust 限制 Windows 上 DirectX 11 游戏 FPS[25] Video: 使用 nom-supreme 编写更好解析器[26],nom-supreme[27] 是一个扩展了...Nom 库,Nom 是一个用于 Rust 解析器组合器库。...上 STM32F4 嵌入式 Rust:svd2rust[31] Tauri vs Iced vs egui:Rust GUI 框架性能比较(包括启动时间、输入滞后、调整大小测试)[32] 从 Erlang

    1K20

    【投稿】Rust 生命周期 —— 从 StrSplit 实例说开去

    根据索引值将字符串分为三个部分,第一部分为 next() 返回值,第二部分为分隔符,第三部分剩余待处理字符串,在下一次调用 next() 作为原始字符串。...,目前实现,将剩余字符串设置为了空字符串(代码 3,line 30); 以分隔符结尾测试用例 "a b c d ",在处理到 "d " 时,调用 next(),此时返回 "d",剩余待处理字符串为空字符串...; 2、在待处理字符串查找分隔符 存在分隔符,得到分隔符第一次出现索引位置,根据索引将字符串分为三个部分,第一部分为此次调用返回值,第二部分为分隔符,第三部分为下一次调用 next() 时待处理字符串...,1)分隔符开始索引,2)分隔符结束索引+1(为了方便处理,类似编程语言中 end() 指向最后一个元素下一个位置);如果分隔符长度固定,可以只需要一个索引值,这里考虑分隔符可能为正则表达式,...实现功能为,在字符串搜索匹配 Pattern,返回匹配字符串开始索引 Some(usize);未找到,返回 None。

    1.7K30

    Rust实战系列-基本语法

    本文是《Rust in action》学习总结系列第二部分,更多内容请看已发布文章: 一、Rust实战系列-Rust介绍 “主要介绍 Rust 语法、基本类型和数据结构,通过实现一个简单版 grep...continue:跳出当前迭代剩余部分 Continue 关键字和其他编程语言中类似,以下是示例: for n in 0..10 { if n % 2 == 0 { continue;...通用函数 当处理多种可能输入类型时,需要另一种特殊函数语法。以下是示例,可以传递不同类型参数,只需要保证两个参数类型相同,并且返回相同类型值。...创建轻量级 grep 已经基本了解 Rust 如何处理数字,接下来会了解 Rust 如何处理 text 文本。...Crates 是 Rust 社区使用名称,类似其他编程语言 package、distribution 或 library 等术语,regex 提供了匹配正则表达式能力。

    2.2K10

    java正则表达式http_Java 正则表达式(精华)

    本教程介绍如何使用正则表达式API。 正则表达式 一个正则表达式是一个用于文本搜索文本模式。换句话说,在文本搜索出现模式。例如,你可以用正则表达式搜索网页邮箱地址或超链接。...如果在文本多次匹配,find() 方法返回第一个,之后每次调用 find() 都会返回下一个。 start() 和 end() 返回每次匹配字串在整个文本开始和结束位置。...John.从每个匹配文本,提取分组1,就是由括号标记部分。...直到最后一个匹配项目,输入文本剩余部分没有拷贝到 StringBuffer. 这部分文本是从最后一个匹配项结尾,到文本末尾部分。...独占模式会尽可能匹配,但不考虑表达式剩余部分是否能匹配上。 .*+ 将会匹配第一个John之后所有字符,这会导致表达式剩余 hurt 没有匹配项。如果改为贪婪模式,会有一个匹配项。

    1.5K10

    Java正则表达式详解

    Java 提供了功能强大正则表达式API,在java.util.regex 包下。本教程介绍如何使用正则表达式API。 正则表达式 一个正则表达式是一个用于文本搜索文本模式。...如果在文本多次匹配,find() 方法返回第一个,之后每次调用 find() 都会返回下一个。 start() 和 end() 返回每次匹配字串在整个文本开始和结束位置。...John.从每个匹配文本,提取分组1,就是由括号标记部分。...直到最后一个匹配项目,输入文本剩余部分没有拷贝到 StringBuffer. 这部分文本是从最后一个匹配项结尾,到文本末尾部分。...独占模式会尽可能匹配,但不考虑表达式剩余部分是否能匹配上。 .*+ 将会匹配第一个John之后所有字符,这会导致表达式剩余 hurt 没有匹配项。如果改为贪婪模式,会有一个匹配项。

    2.5K00

    还不会正则表达式?看这篇!

    正则表达式(Regular Expression或Regex),是用于定义某种特定搜索模式字符组合。正则表达式可用于匹配、查找和替换文本字符,进行输入数据验证,查找英文单词拼写错误等。...常见flags有: g:全局匹配(global);正则表达式默认只会返回第一个匹配结果,使用标志符g则可以返回所有匹配 i:忽略大小写(case-insensitive);在匹配时忽略英文字母大小写...比如,/^A/ 不匹配 "an Apple" "A",匹配 "An apple" "A" $:匹配输入结尾。...比如,/t$/ 不匹配 "eater" "t",匹配 "eat" "t"。..., 每部分格式标准为(进行了相应简化,主要为展示如何书写正则): yourname:任意英文字母(a-z/A-Z)、数字(0-9)、下划线

    77320

    grep note

    排除扩展名为java, js 和 md~ 文件 如何在 Linux 系统和类 Unix 操作系统中使用带正则表达式 grep 命令呢?...Linux 系统自带了支持拓展正则表达式 GNU 版本 grep 工具。所有的 Linux 系统默认安装都是 GNU 版 grep 。...grep 命令被用来检索一台服务器或工作站上任何位置文本信息。 快速了解正则表达式 如何匹配你要查找内容? 正则表达式只不过是每个输入匹配模式。模式是一个字符序列。...固定检索内容位置: 你可以使用 ^ 和 $ 符号强制一个正则表达式分别匹配一行开始或结束位置。...使用下面例子语法:grep --color regex FILENAME 如何使 grep 输出只显示匹配部分而不是整行?

    2.7K20

    听GPT 讲Rust源代码--srctools(23)

    它建议将返回值直接作为函数返回值,而不是将其保存在一个临时变量。 UNUSED_MATCH:这个lint用于检查使用match表达式时,是否有多个分支(即多个模式匹配),其中某些分支没有使用。...PathPattern结构体包含一个字符串用于匹配路径,可以使用通配符和变量来表示不确定部分。它还包含一些方法用于匹配和提取路径特定部分。...该文件定义了几个重要struct和enum,它们是: Regex:该struct表示一个正则表达式,包含了正则表达式字符串、编译后正则表达式以及用于匹配正则表达式选项等信息。...RegexSet:该struct表示一组正则表达式集合。它可以用于同时匹配多个正则表达式,并对匹配结果进行处理。 RegexKind:该enum表示正则表达式类型。...在Clippy代码检查,有不同规则对应不同类型正则表达式,比如Match用于匹配操作,Split用于拆分操作等。

    15410

    还不会正则表达式?看这篇!

    正则表达式(Regular Expression或Regex),是用于定义某种特定搜索模式字符组合。正则表达式可用于匹配、查找和替换文本字符,进行输入数据验证,查找英文单词拼写错误等。...常见flags有: g:全局匹配(global);正则表达式默认只会返回第一个匹配结果,使用标志符g则可以返回所有匹配 i:忽略大小写(case-insensitive);在匹配时忽略英文字母大小写...比如,/^A/ 不匹配 "an Apple" "A",匹配 "An apple" "A" $:匹配输入结尾。...比如,/t$/ 不匹配 "eater" "t",匹配 "eat" "t"。..., 每部分格式标准为(进行了相应简化,主要为展示如何书写正则): yourname:任意英文字母(a-z/A-Z)、数字(0-9)、下划线

    70710

    还不会正则表达式?看这篇!

    正则表达式(Regular Expression或Regex),是用于定义某种特定搜索模式字符组合。正则表达式可用于匹配、查找和替换文本字符,进行输入数据验证,查找英文单词拼写错误等。...常见flags有: g:全局匹配(global);正则表达式默认只会返回第一个匹配结果,使用标志符g则可以返回所有匹配 i:忽略大小写(case-insensitive);在匹配时忽略英文字母大小写...比如,/^A/ 不匹配 "an Apple" "A",匹配 "An apple" "A" $:匹配输入结尾。...比如,/t$/ 不匹配 "eater" "t",匹配 "eat" "t"。..., 每部分格式标准为(进行了相应简化,主要为展示如何书写正则): yourname:任意英文字母(a-z/A-Z)、数字(0-9)、下划线

    90740

    PHP中有关正则表达式函数集锦

    当时初学PHP根本不知道PHP有专门抓包工具,就像Simple_html_dom.php(在我其他博文中有提到),之前根本就不知道有这东西,所以就自己废着劲去学习正则表达式,然后再学习PHP中正则表达式函数是如何使用...该函数只 作一次匹配,最终返回0或1匹配结果数。    2.ereg()和eregi()     ereg()是POSIX扩展库中正则表达式匹配函数。...eregi()是ereg()函数忽略大小写版 本。二者与preg_match功能类似,函数返回是一个布尔值,表明匹配成功与否。...对于输入数组$input每个元素,preg_grep()也只进行一次匹配。代码6.3给出示例简单地说明了preg_grep()函数使用。...如 果设定了$limit,则返回数组最多包含$limit个单元。而其中最后一个单元包含了$string剩余所有部分。spliti是split 忽略大小版本。

    1.1K50

    软件架构:使用脚本来增强系统灵活性

    Rust 下,我们可以很容易用 nom/pest 做对于上述语法解析器,但是很快你会发现如果一开始没有很好地思考和设计这个 DSL,很容易陷入语法越来越复杂,功能越来越乱境地。...,那么如何做 proxy 决策是不是也可以完全交给用户来处理呢(而不是把逻辑限制在路径匹配上)?...在我Rust 第一课》我介绍过如何使用 Rust 构建一个通用 pipeline,这里代码基本就是课程中代码简单修改: 有了基本 pipeline 执行引擎,之后就是把 proxy_handler...proxy server 在 EvalRule plug ,先检查动态规则,如果没匹配,再检查静态配置规则。...这样动态添加规则能力虽然强大,如果没有一个与之匹配 UI,并提供各种开箱即用(或者简单修改就可以使用)规则和 rhai 代码,那么功能会大打折扣,因为用户很难用得起来。

    86440

    Rust学习笔记Day24 常用库及生态领域

    futures/async-trait 标准库已经采纳了 futures 库 Future trait,并通过 async/await 关键字,使异步处理成为语言部分。...nom/pest/combine 这是三个非常优秀 parser 库,可以用来撰写高效解析器。在 Rust 下,当你需要处理某些文件格式时:首先可以考虑 serde。...如果你享受直接安全 SQL 查询,可以使用 sqlx。 客户端开发 areweguiyet.com 页面,我们可以看到大量 GUI 库。...虽然在云原生方面,Rust 还是个弟弟,这个弟弟有着强大降维打击能力。...比如被接纳为 CNCF sandbox 项目不久 akri,它就是一个管理嵌入式设备云原生项目。 机器学习开发 机器学习 / 深度学习是 Rust 很有潜力,目前生态还很匮乏领域。

    1.7K31

    挑战30天学完Python:Day18 正则表达式

    总之如果你想提升自己Python技能,欢迎加入《挑战30天学完Python》 Day 18 正则表达式 正则表达式是一个特殊字符序列,它能帮助你方便检查一个字符串是否与某种模式匹配。...re.search: 如果字符串(包括多行字符串)中有匹配对象,则返回匹配对象。 re.findall: 返回包含所有匹配列表,如果没有匹配返回空列表。...Match # 语法形式 match(pattern, string, flags=0) # pattern: 匹配正则表达式 # string:要匹配字符串 # flags:[可选] 用来控制正则表达式匹配方式...因为它可以在整个文本中进行查找匹配。并返回第一找到对象,否则返回None。接下来还有一个更好函数 findall 它可以匹配所有并以列表形式返回。...要么是 banana (): 正则表达式分组并记住匹配文本 让我们用一些例子来上边这些匹配字符是如何使用

    31540

    Go 最佳正则表达式替代方案

    使用C++ re2来提高处理大输入或复杂表达式时性能; regexp2 (1.10.0) — 一个功能丰富Go正则表达式引擎。...处理文本没有匹配正则表达式速度有多快? 不同库使用多少内存? 使用分组我可以编译多少个正则表达式? 2....不匹配正则表达式 在前面的案例,我们模拟了数据始终存在匹配理想情况。但是,如果文本没有匹配正则表达式怎么办,这会对性能产生多大影响?...在此测试,我另外为 SSN 添加了5 个与数据不匹配修改后正则表达式。...让我们看看它如何影响查找所有匹配项所需时间: 下图显示了处理所有10 个正则表达式所需时间(按Non-matching处理时间排序): 结论: 这次是相同:顺序处理中最快是 — Rure,

    1.7K40
    领券