使用Regex解析cpp中的字符串并创建映射
Using Regex to parse a string in cpp and creating a map
在cpp中:我正在尝试解析一个给定的字符串,该字符串被构建为-"x=3.5;y=9.5"在使用regex并在x和其值3.5之间构建MAP时,我需要解析x和它的值,y和9.5也是如此。变量名称必须以字符a-z开头,然后才能包含score、数字和字符。变量之间的分隔符为";">
正如您所提到的,我将假设您的输入文件保证看起来像您所描述的那样——否则,C++太复杂了,无法用正则表达式进行一般解析。
您应该为单个赋值创建一个正则表达式模式,并使用sregex_iterator
逐步完成它
我将在此处调整示例:https://en.cppreference.com/w/cpp/regex/regex_iterator
std::regex declare_pattern(R"(([a-zA-Z_]w*)=(d+.d*);?)");
std::string input("x2=2;_y=5.2");
auto declare_begin = std::sregex_iterator(input.begin(), input.end(), declare_pattern);
auto declare_end = std::sregex_iterator();
for (std::sregex_iterator i = declare_begin; i != declare_end; ++i) {
std::smatch match = *i;
std::cout << match[1] << " is " << std::stof(match[2]) << 'n';
}
分解正则表达式
R"(...)"
-这是一个原始字符串,所以我可以使用反斜杠,而编译器不会试图转义它们([a-zA-Z_]w*)
-这是一个变量。括号中的内容与一个字母字符或下划线匹配。w*
匹配零个或多个"单词"字符(即a-z、a-z、_和0-9(。周围的括号意味着我们要"捕获"它,或者记录它,以便稍后使用match[N]
访问它=
-字面上的字符"=">(d+.d*)
匹配一个非常简单的float,比如"42.123"。你需要一个更复杂的模式来匹配C++表达数字、科学符号等的所有不同方式;?
-(可选(匹配分号以分隔声明
这会进行零验证。处理空白等零怪癖。在一定程度的复杂性之后,您应该考虑尝试进行传统解析。我喜欢PEGLTL,它可以描述简单的模式,而不会用正式的符号或概念来压倒人们:
struct number : seq< plus<digit>, one<'.'>, plus<digit> > {};
struct assignment : seq< identifier, one<'='>, number > {};
struct var_list : list< assignment, one<';'> > {};
/*...*/
memory_input in( "x=2.2;y=3", "" );
auto result = parse< var_list >( in );
相关文章:
- 当分配一个字符串值并稍后通过分配另一个值进行更改时C++如何管理内存?
- std::regex:匹配由数字和空格组成的字符串,并提取数字.如何?
- 连接资源文件中的字符串,并将其传递给菜单项字符串 (winapi) c++
- 拆分字符串输入并查找字符是否有效
- 二进制字符数组转换为字符串流并从缓冲区弹出
- 文本文件中的 grep 字符串,并将它们复制到 CMake 中的目录中
- C++最快的字符串小写并查找
- 从文件到字符串读取并传递到功能
- 如何在其中创建2D字符串向量并插入数据
- 输入到字符串流并在单个语句中转换为字符串.可以没有帮助程序类
- 如何查找查看一个字符串是否位于另一个字符串内部并替换它
- std::variant 存储多个字符串类型并区分它们
- 有没有办法将数字作为字符串,并在不使用浮点数或双精度数的情况下将其四舍五入到确切的位数
- 将char添加到字符串中并删除char数组
- 如何将浮子值的字节存储在字符串中并以后检索值
- 如何存储在字符串中并转换为字符数组
- 如何记录QObject::tr的原始字符串,并仍然向GUI显示翻译
- 在班级中使用动态分配的C风格字符串,并带有复制和分配操作员,给出了意外的结果
- 将utf8编码的字符串转换为本地8位编码的字符串,并将无法确定的字符替换为空白
- 将浮点数转换为字符串,并指定精度和十进制数字数?