如何将字符串解析为 std::map 并验证其格式?

2023-12-27

我想解析一个字符串"{{0, 1}, {2, 3}}" into a std::map。我可以编写一个小函数来解析字符串<regex>库,但我不知道如何检查给定的字符串是否采用有效的格式。如何验证字符串的格式?

#include <list>
#include <map>
#include <regex>
#include <iostream>

void f(const std::string& s) {
  std::map<int, int> m;
  std::regex p {"[\\[\\{\\(](\\d+),\\s*(\\d+)[\\)\\}\\]]"};
  auto begin = std::sregex_iterator(s.begin(), s.end(), p);
  auto end = std::sregex_iterator();
  for (auto x = begin; x != end; ++x) {
    std::cout << x->str() << '\n';
    m[std::stoi(x->str(1))] = std::stoi(x->str(2));
  }
  std::cout << m.size() << '\n';
}

int main() {
  std::list<std::string> l {
    "{{0, 1},   (2,    3)}",
    "{{4,  5, {6, 7}}" // Ill-formed, so need to throw an excpetion.
  };
  for (auto x : l) {
    f(x);
  }
}

注意:我觉得没有义务使用regex来解决这个问题。任何类型的解决方案,包括通过减去子字符串来立即验证和插入的一些方法,都将受到赞赏。


在我看来,基于 Spirit 的解析器总是更加健壮和可读。用 Spirit 来解析也更有趣:-)。因此,除了 @Aleph0 的答案之外,我还想提供一个基于 Spirit-X3 的紧凑型解决方案 https://wandbox.org/permlink/cQRCb2R0xdJthGbS:

#include <string>
#include <map>
#include <iostream>
#include <boost/fusion/adapted/std_pair.hpp>
#include <boost/spirit/home/x3.hpp>

int main() {
    std::string input ="{{0, 1},  {2, 3}}";
    using namespace boost::spirit::x3;
    const auto pair = '{' > int_ > ',' > int_ > '}';
    const auto pairs = '{' > (pair % ',')  > '}';
    std::map<int, int> output;
    // ignore spaces, tabs, newlines
    phrase_parse(input.begin(), input.end(), pairs, space, output);

    for (const auto [key, value] : output) {
        std::cout << key << ":" << value << std::endl;
    }
}

请注意,我使用了运算符>,意思是“期望”。因此,如果输入与预期不符,Spirit 就会抛出异常。如果您希望静默失败,请使用运算符>>反而。

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

如何将字符串解析为 std::map 并验证其格式? 的相关文章

  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • shell中如何分割字符串

    我有一个变量作为 string ABC400p2q4 我怎样才能分开ABC400 and p2q4 我需要将它分成两个变量 结果我得到 echo var1 ABC400 echo var2 p2q4 可以用任何字母字符代替 ABC 可以用任
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template

随机推荐

  • 多列上的 DISTINCT

    I have SELECT DISTINCT first second third FROM table 我不仅希望第一个是 DISTINCT 第二个是 DISTINCT 而且还希望第三个保持不 DISTINCT 我这样尝试过 SELECT
  • 使用 DataTrigger 的 .NET Maui 样式

    概述 我有两个属性 IsPast IsCurrentMonth 如果已经过去或者not当月我想用红色显示标签 以下代码是默认 Maui 应用程序的缩小版本 如果你运行它 你会得到红色标签 预期 单击一次后 它会保持红色 预期 但单击后会打开
  • 如何告诉 forfiles 执行 PATH 中的命令?

    我在以下 Windows Server 2k3 批处理命令中遗漏了一些有关转义字符串或空格的内容 明显 FORFILES m wsp c CMD C C Program Files Common Files Microsoft Shared
  • 禁用 cookie 的 PHP 会话是否有效?

    今天我参加了 Skype 面试 面试的是 PHP 开发人员的工作 其中一个问题是关于 Cookie 和 PHP 会话 问题是 如果用户浏览器中禁用了 Cookie PHP 会话是否可以设置 读取 使用 我告诉他们不是 因为默认情况下 PHP
  • 当实体映射到存储过程时,如何在调用 SaveChanges() 后获取实体的标识

    我们使用实体框架 4 0 并且有一个映射到 DBA 提供的存储过程的实体 映射详细信息中的插入 更新和删除函数都有自己的存储过程 当使用映射到表的实体时 我可以添加新实体 调用dataContext SaveChanges 然后我实例化的新
  • phonegap 运行 android - 创建命令失败,退出代码为 8 - linux

    我做了一些谷歌搜索 但没有发现任何有价值的东西 任何帮助表示赞赏 使用裸虚拟机尝试一下以确保 没有 Nodejs 安装或依赖问题 基督教 sudo apt get install nodejs sudo apt get install no
  • MembershipProvider 更改代码中的连接字符串

    我正在尝试在我的网站中实现 Asp net 表单身份验证 通常 您在 web config 中提供数据库连接字符串的名称 然而 由于我们的数据库设置有点复杂 我一直在寻找一种在代码中手动向 MembershipProvider 提供连接字符
  • 如何在 RubyMine 上使用 bundle exec rake?

    我在堆栈溢出中找到了这篇文章rubymine 错误 您已经激活了 rake 10 0 3 但您的 Gemfile 需要 rake 0 9 6 使用bundle exec 可以解决这个问题 https stackoverflow com qu
  • 字符串格式的疯狂问题

    我遇到了一个让我发疯的问题 我的宏中有两个 FOR 循环 每个循环都有一个计数器来跟踪某个过程执行的次数 计数器工作得很好 并且在循环结束时包含正确的数字 我要做的下一件事是将计数格式化为带有前导零的五位数字 我尝试过使用两种不同的方法 见
  • Celery:长期专用的整体任务与短期的多个任务

    在我的解决方案中 我使用分布式任务来监视硬件实例一段时间 例如 10 分钟 当以下情况时我必须做一些事情 我开始这个监控会话 我完成了这个监控会话 可能 在监控会话期间 在整个会话 10 分钟 内运行单个任务并执行所有这些操作是否安全 或者
  • 在过去的 7-8 年里,对 C++ 编程影响最大的是什么?

    我开始用 C 编程 这是我的第一语言 但我已经很多年没有使用它了 C 世界有哪些新的发展 什么是重要的东西 技术 书籍 框架 库等 在过去的 7 8 年里 对 C 编程影响最大的是什么 也许我们可以对每个帖子产生一个影响 这样我们就可以对它
  • IOError: [Errno 22] 无效参数 python write

    我正在写入网络共享 这是写入的代码 while not created fileName join random choice CANDIDATE CHARS for x in range len fullPath os path join
  • 如何修复 FileZilla 的响应:“550 提供的消息不完整。签名未验证。”?

    如何修复 FileZilla 的响应 550 提供的消息不完整 签名未得到验证 这有什么问题吗 这是在我的托管站点中还是在我的 FileZilla 设置中 由于已知错误 Windows IIS 服务器返回此错误 详细信息请参见微软文章修复
  • Visual Studio Code 中的多个格式化程序

    在我的团队中 有些人使用 VS Code 其他人使用 WebStorm 为了调整代码格式 我编写了 VS Code 的扩展 添加了一些缺失的规则 我的计划是与 VS Code 附带的本机格式化程序一起运行我的扩展 我使用 API 提供我的编
  • .NET 高级中 .NET 4.0 和 .NET 4.5 之间的差异

    渴望了解 NET 4 0 和 NET 4 5 在 NET 高级方面的差异以及 ASP NET C 以及这些框架中的差异 NET Framework 4 5 中的新增功能 http www techbubbles com net framew
  • 按多个属性对对象进行排序

    我一直在研究一些需要我按三个属性对对象 软饮料 进行排序的事情 name str colour str and volume int 我进行了研究并找到了分别按名称 颜色和体积对它们进行排序的方法 但是有没有一种方法可以按所有三个对它们进行
  • 如何使用 django 检查 postgresql 数据库中是否存在某些内容?

    我想检查数据库中的行是否已包含特定输入 如果它已经存在 则防止再次添加它 如果不存在 则像平常一样添加它 如何询问数据库是否存在某些内容 而不需要从数据库中提取所有内容进行检查 您可以使用 Entry objects filter name
  • 权限拒绝:打开提供程序 com.android.providers.media.MediaDocumentsProvider

    我试图允许用户访问他的照片库以获取个人资料图片 并将该个人资料图片保存到 SharedPreferences 中 我还有一个导航栏 可以从 SharedPreferences 获取这张图片 我收到以下错误 java lang Securit
  • Android Studio:多个模块的多个 APK

    在 Android 中 有一种方法可以为项目中的所有模块生成签名的 APK 例如 我有以下项目 Project Library Module Module 1 Module 2 Module 3 我想用一个命令为所有 3 个模块生成 APK
  • 如何将字符串解析为 std::map 并验证其格式?

    我想解析一个字符串 0 1 2 3 into a std map 我可以编写一个小函数来解析字符串