用于解析数据的正则表达式

2023-12-24

我正在编写一个从简单文本文件中读取一些数据的应用程序。数据文件, 我感兴趣的,有以下形式的行:

Mem(100) = 120
Mem(200) = 231
Mem(43) = 12
...
Mem(1293) = 12.54

所以,正如你所理解的,每条线的模式是这样的

(\s)*(\t)*Mem([0-9]*) (\s,\t)*= (\s,\t)*[0-9]*(.)*[0-9]*

就像我在字符序列“Mem”之前有任意数量的空格,然后是 左括号。然后是一个数字和一个右括号。之后,会出现任意数量的空格,直到遇到“=”(等于)字符。然后,任意数量的空格,直到遇到(可能)浮点数。

我如何用 C++ 正则表达式模式来表达这一点?我对 C++ 中的正则表达式概念非常陌生,所以我需要一些帮助。

谢谢


首先,请记住#include <regex>.

C++ std::regex_match与其他语言中的正则表达式一样工作。

让我们从一个简单的例子开始:

std::string str = "Mem(100)=120";
std::regex regex("^Mem\\([0-9]+\\)=[0-9]+$");
std::cout << std::regex_match(str, regex) << std::endl;

在这种情况下,我们的正则表达式是^Mem\([0-9]+\)=[0-9]+$。 让我们看看它做了什么:

  • The ^开头告诉 C++ 这是该行的开始位置,所以AMem(1)=2不应该匹配。
  • The $最后告诉 C++ 这是该行结束的地方,所以Mem(1)=2x不应该匹配。
  • \\(是一个字面意思(特点。(在正则表达式中具有非常特殊的含义,因此我们对其进行转义\(。但是,那\字符在 C++ 字符串中具有特殊含义,因此我们使用\\(告诉 C++ 通过\(到正则表达式引擎。
  • [0-9]匹配一个数字。\\d应该也有效,但是那么也许不是 https://stackoverflow.com/questions/6479423/does-d-in-regex-mean-a-digit.
  • [0-9]+ means 最后一个数字。如果Mem()是可以接受的,然后使用[0-9]*反而。

正如您所看到的,这就像您在其他语言(例如 Java 或 C# )中找到的正则表达式一样。

现在,要考虑空白,请使用std::regex regex("^\\s*Mem\\([0-9]+\\)\\s*=\\s*[0-9]+\\s*$");

注意\s包括\t,因此无需同时指定两者。如果没有,你会使用(\s|\t) or [\s\t], not (\s,\t).

最后,要包含浮点数,我们首先需要考虑是否Mem(1) = 1.(即后面没有数字的点)是可以接受的。

如果不是,那么.23 in 1.23 is optional。在正则表达式中,我们使用?来表明这一点。

std::regex regex("^[\\s]*Mem\\([0-9]+\\)\\s*=\\s*[0-9]+(\\.[0-9]+)?\\s*$");

请注意,我们使用\.而不仅仅是.. .在正则表达式中具有特殊含义 - 它匹配任何字符 - 因此我们需要对其进行转义。

如果您有支持原始字符串的编译器(例如视觉工作室2013 http://msdn.microsoft.com/en-us/library/vstudio/hh567368%28v=vs.120%29.aspx, GCC 4.5 http://gcc.gnu.org/projects/cxx0x.html, 铿锵3.0 http://clang.llvm.org/cxx_status.html),您可以简化正则表达式字符串:

std::regex regex(R"(^[\s]*Mem\([0-9]+\)\s*=\s*[0-9]+(\.[0-9]+)?\s*$)")

要提取有关匹配字符串的信息,您可以使用std::smatch and groups.

让我们从一个小改变开始:

std::string str = " Mem(100)=120";
std::regex regex("^[\\s]*Mem\\(([0-9]+)\\)\\s*=\\s*([0-9]+(\\.[0-9]+)?)\\s*$");
std::smatch m;

std::cout << std::regex_match(str, m, regex) << std::endl;

注意三件事:

  1. 我们添加了smatch。此类存储有关比赛的额外结果信息。
  2. 我们在周围添加了额外的括号[0-9]*。这定义了一个组。组告诉正则表达式引擎跟踪其中的任何内容。
  3. 浮点数周围还有更多括号。这定义了第二组。

非常重要的是定义组的括号不会被转义因为我们不希望它们匹配实际的括号字符。我们实际上想要特殊的正则表达式含义。

现在我们有了组,我们可以使用它们:

for (auto result : m) {
    std::cout << result << std::endl;
}

这将首先打印整个字符串,然后打印数字Mem(),然后是最终数字。

换句话说,m[0]给我们整场比赛,m[1]给我们第一组,m[2]给我们第二组m[3]如果我们有的话,会给我们第三组。

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

用于解析数据的正则表达式 的相关文章

  • 迭代变量并查找特定类型实例的技术

    我想迭代进程中内存中的变量 通过插件动态加载 并查找特定类型的实例 以前我可以找到特定类型 或内存中的所有类型 我可以创建类型的实例 我可以获取作为不同类型的字段包含的实例 但我无论如何都不知道只是 搜索 特定类型的实例 一种方法是使用 W
  • 使用具有现有访问令牌的 Google API .NET 客户端

    用例如下 移动应用程序正在通过 Google 对用户进行身份验证 并且在某些时候 我们需要将用户的视频发布到他的 YouTube 帐户 出于实际原因 实际发布应该由后端完成 已经存储在那里的大文件 由于用户已经通过应用程序的身份验证 因此应
  • 32 位应用程序的特征最大矩阵大小

    所以 我正在寻找Eigen http eigen tuxfamily org index php title Main Page当我尝试声明大于 10000x10000 的矩阵时 包崩溃 我需要声明一个像这样的矩阵 可靠地大约有 13000
  • vim 中的正则表达式查找和替换:向数字添加 .0

    我有一个如下所示的文件 1 1 0 1 6 1 0 2 8 1 0 3 10 1 0 4 12 1 0 6 如何为所有数字添加 0 后面的数字除外 我认为用正则表达式来做到这一点应该不会太难 但是我的正则表达式知识太生疏了 使用 VIM s
  • C# 中的接口继承

    我试图解决我在编写应用程序时遇到的相当大的 对我来说 问题 请看这个 为了简单起见 我将尝试缩短代码 我有一个名为的根接口IRepository
  • 构造函数中显式关键字的使用

    我试图了解 C 中显式关键字的用法 并查看了这个问题C 中的explicit关键字是什么意思 https stackoverflow com questions 121162 但是 那里列出的示例 实际上是前两个答案 对于用法并不是很清楚
  • 对齐 GridView 中的行值

    我需要在 asp net 3 5 中右对齐 gridview 列中的值 我怎样才能做到这一点
  • 无法将类型“System.IO.Stream”隐式转换为“Java.IO.InputStream”

    我提到了一些类似的问题 但没有一个涉及IO 当我使用时 我在java中使用了相同的代码Eclipse 那次就成功了 但现在我尝试在中使用这段代码Mono for Android C 它不起作用 我正在尝试运行此代码来创建一个InputStr
  • 如何重置捕获像素的值

    我正在尝试创建一个 C 函数 该函数返回屏幕截图位图中每四个像素的 R G 和 B 值 这是我的代码的一部分 for int ix 4 ix lt 1366 ix ix 4 x x 4 for int iy 3 iy lt 768 iy i
  • 为什么我不应该对不是由 malloc() 分配的变量调用 free() ?

    我在某处读到 使用它是灾难性的free删除不是通过调用创建的对象malloc 这是真的 为什么 这是未定义的行为 永远不要尝试它 让我们看看当您尝试时会发生什么free 自动变量 堆管理器必须推断出如何获取内存块的所有权 为此 它要么必须使
  • 通过 NHibernate 进行查询,无需 N+1 - 包含示例

    我有一个 N 1 问题 我不知道如何解决它 可以在这个问题的底部找到完全可重复的样本 因此 如果您愿意 请创建数据库 设置 NUnit 测试和所有附带的类 并尝试在本地消除 N 1 这是我遇到的真实问题的匿名版本 众所周知 这段代码对于帮助
  • 当我“绘制”线条时,如何将点平均分配到 LineRenderer 的宽度曲线?

    我正在使用线条渲染器创建一个 绘图 应用程序 现在我尝试使用线条渲染器上的宽度曲线启用笔压 问题在于 AnimationCurve 的 时间 值 水平轴 从 0 标准化为 1 因此我不能在每次添加位置时都在其末尾添加一个值 除非有一个我不知
  • System.Runtime.InteropServices.COMException(0x80040154):[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 C 项目中遇到异常 System Runtime InteropServices COMException 0x80040154 检
  • 将代码拆分为标头/源文件

    我从 Asio 的示例页面中获取了以下代码 class tcp connection public boost enable shared from this
  • 如何在 javascript 正则表达式中匹配平衡分隔符?

    我原以为这个问题是不可能的 据我所知 Javascript 的正则表达式既没有递归插值 也没有漂亮的 NET 平衡组功能 但问题就在那里 如问题 12 所示正则表达式 alf nu http regex alf nu 匹配平衡对 lt an
  • 结构体指针的动态数组

    我必须使用以下代码块来完成学校作业 严格不进行任何修改 typedef struct char firstName char lastName int id float mark pStudentRecord pStudentRecord
  • 什么是 __declspec 以及何时需要使用它?

    我见过这样的例子 declspec在我正在阅读的代码中 它是什么 我什么时候需要使用这个构造 这是 Microsoft 对 C 语言的特定扩展 它允许您使用存储类信息来赋予类型或函数属性 文档 declspec C https learn
  • 双精度类型二维多维数组的 pinvoke 编组作为 c# 和 c++ 之间的输入和输出

    我有以下我正在尝试解决的双物质类型的 2d 多维数组的 c 和 c pinvoke 编组 我已经查看了以下热门内容以获得我目前拥有的内容使用双精度数组进行 P Invoke 在 C 和 C 之间编组数据 https stackoverflo
  • WinRT 定时注销

    我正在开发一个 WinRT 应用程序 要求之一是应用程序应具有 定时注销 功能 这意味着在任何屏幕上 如果应用程序空闲了 10 分钟 应用程序应该注销并导航回主屏幕 显然 执行此操作的强力方法是在每个页面的每个网格上连接指针按下事件 并在触
  • 是否可以在 C# 中强制接口实现为虚拟?

    我今天遇到了一个问题 试图重写尚未声明为虚拟的接口方法的实现 在这种情况下 我无法更改接口或基本实现 而必须尝试其他方法 但我想知道是否有一种方法可以强制类使用虚拟方法实现接口 Example interface IBuilder

随机推荐

  • 在 R 中对“年/月”列进行排序

    我试图在 R 中按 year month 列对数据框进行排序 但停留在 as Date 函数上 我尝试了其他几种方法但没有成功 我可以寻求帮助吗 这里是 我的代码是 temp2 sort lt temp2 with temp2 order
  • R:将查找表与数据框合并

    我正在使用 R 编程语言 我有以下有关患者医疗特征和疾病患病率的数据集 set seed 123 library dplyr Patient ID 1 5000 gender lt c Male Female gender lt sampl
  • WordPress 在不使用 get_posts() 的情况下获取帖子数量?

    需要一个专门设计用于获取匹配条件的帖子计数的函数调用 我认为 get posts 函数对于此操作来说太昂贵了 我只是想决定当有预定义数量的帖子要显示时是否显示 查看更多帖子 链接 例如 要显示的默认帖子链接数为 3 我只想在帖子总数超过 3
  • SPARK SQL - 使用 DataFrames 和 JDBC 更新 MySql 表

    我正在尝试使用 Spark SQL DataFrames 和 JDBC 连接在 MySql 上插入和更新一些数据 我已成功使用 SaveMode Append 插入新数据 有没有办法从 Spark SQL 更新 MySql 表中已有的数据
  • Javascript:将逗号替换为### - 仅用双引号[重复]

    这个问题在这里已经有答案了 在下面的字符串中 This is just for Test ignore it My name is FirstName LastName 我想将双引号 内的所有逗号 替换为 目前我只找到了 的匹配模式 但需要
  • jQuery + JSON 如何从变量定义键

    我有以下代码 post factory set key value function response json where key foo value bar 但服务器总是获取 key 和 bar 有没有办法将键设置为变量 而不是字符串
  • ASP.Net MVC 和 Comet (WebSync)

    我正在尝试在我的 ASP Net MVC 2 0 项目中实现 comet 我在用着WebSync http www frozenmountain com websync 来自冰冻山 我的网站是用 C 4 0 和 ASP Net 4 0 编码
  • 直接从 Eclipse 本地历史记录恢复已删除的文件

    发生了一些 git 错误 我丢失了一个文件的很多更改 我使用 Eclipse 作为 IDE 但 git 错误包括删除项目并重新克隆目录 所以我无法从 Eclipse 中进行恢复 我相信我已经找到了包含我想要恢复的代码的本地历史文件 但我不确
  • 我可以在 Windows Azure 中托管应用程序并将数据库存储在不同的服务器上吗

    我可以在 Windows Azure 中托管应用程序并将数据库存储在不同的服务器上吗 例如 我想将我的数据保存在服务器上 这样我就不必担心隐私问题 如果这是可能的 是否会消除在云中托管应用程序的价值 thanks 您的意思是在 Window
  • 您如何知道 Pytorch Save 是否包含模型和/或仅包含权重?

    我对 pytorch 相当陌生 这可能是版本问题 但我看到使用了 torch load 和 torch load state dict 但在这两种情况下 文件扩展名通常是 pth 我创建的模型 我可以通过 torch Save 和 torc
  • 使用 Python 抓取 PDF 文本 (pdfquery)

    我需要抓取一些 PDF 文件来提取以下文本信息 我尝试使用 pdfquery 来完成此操作 方法是解决我在 Reddit 上找到的示例 请参阅第一篇文章 https www reddit com r Python comments 4bnj
  • QTableWidgetItem 文本已更改

    我正在寻找一种干净的方式来对事件做出反应 如果QTableWidgetItem已更改其文本 我尝试过使用信号QTableWidget itemChanged QTableWidgetItem item 但这会导致错误 因为我更改了背景颜色Q
  • 在 C++ 中,“operator !=”是否应该始终通过“operator ==”来实现?

    我目前查看了一个旧的 C 代码库 发现很多代码都是这样的 bool SomeClass operator const SomeClass other const return member1 other member1 member2 ot
  • 优化点-圆距离法

    我正在实施 RANSAC 算法来检测图像中的圆圈 我分析了执行情况 得到 13699392 function calls in 799 981 seconds Random listing order was used ncalls tot
  • Jetpack Compose 中的文本超链接主题标签 (#) 和提及 (@)?

    Jetpack Compose 中的文本超链接主题标签 和提及 Composable fun HashtagsAndMentions val colorScheme MaterialTheme colorScheme val primary
  • 如何在 FeignClient 中调用带有多个查询字符串参数的 url?

    我尝试使用多个查询字符串参数调用 Google API 奇怪的是 我找不到办法做到这一点 这是我的 FeignClient FeignClient name googleMatrix url https maps googleapis co
  • 为什么页脚项目不包含在 Repeater.Items 中?

    我需要在按钮的 OnClick 事件中从 FooterTemplate 内的文本框中获取值 我的第一个想法是循环遍历中继器上的 items property 但正如您在此示例中所看到的 它只包括实际的数据绑定项 而不包括页脚项 ASPX
  • ob_get_clean 和 ob_get_flush 之间的区别

    它们似乎都做同样的事情 将输出缓冲区内容返回给您 然后将其删除 我应该使用哪一个 ob get clean http php net manual en function ob get clean php删除缓冲区 不打印它 并返回其内容
  • Android 中选项卡式视图寻呼机的单独后退导航

    我想要的是 在选项卡滑动菜单上下文中 我想将选项卡内的一个片段替换为另一个片段 并维护选项卡菜单以及当前选项卡 当滑动到另一个选项卡并返回到原始选项卡时 我希望显示最后一个片段 例如 我有tab a with Fragment 1 tab
  • 用于解析数据的正则表达式

    我正在编写一个从简单文本文件中读取一些数据的应用程序 数据文件 我感兴趣的 有以下形式的行 Mem 100 120 Mem 200 231 Mem 43 12 Mem 1293 12 54 所以 正如你所理解的 每条线的模式是这样的 s t