使用Regex解析cpp中的字符串并创建映射

Using Regex to parse a string in cpp and creating a map

本文关键字:字符串 串并 创建 映射 字符 Regex 解析 cpp 使用      更新时间:2023-10-16

在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 );
相关文章: