Regular Expression For Parsing Data
我正在编写一个应用程序,它从一个简单的文本文件中读取一些数据。数据文件,我感兴趣的,有以下形式的行:
1 2 3 4 5 | Mem(100) = 120 Mem(200) = 231 Mem(43) = 12 ... Mem(1293) = 12.54 |
所以,正如你所理解的,每一行的模式是
1 | (\s)*(\t)*Mem([0-9]*) (\s,\t)*= (\s,\t)*[0-9]*(.)*[0-9]* |
就像我在字符序列"mem"之前有任意数量的空格,后面跟左括号。然后,有一个数字和一个右括号。然后,在遇到"="(等于)字符之前,有任意数量的空格。然后,任何数量的空格,直到我遇到一个(可能的)浮点数。
如何在C++正则表达式中表达这一点?我对C++中的正则表达式概念非常陌生,所以我需要一些帮助。
谢谢你
首先,记住
C++ EDCOX1 1的工作方式类似于其他语言中的正则表达式。
让我们从一个简单的例子开始:
1 2 3 | std::string str ="Mem(100)=120"; std::regex regex("^Mem\\([0-9]+\\)=[0-9]+$"); std::cout << std::regex_match(str, regex) << std::endl; |
在这种情况下,我们的regex是
- EDOCX1 3开始时告诉C++这是线路开始的地方,所以EDCOX1×4不应该匹配。
- EDOCX1的5位在结尾告诉C++,这是行结束的地方,所以EDCOX1×6 }不应该匹配。
\\( 是一个文字( 字符。( 在正则表达式中有一个非常特殊的意义,所以我们将它从\( 中去掉。然而,EDCOX1×11字符在C++字符串中有着特殊的含义,所以我们使用EDCOX1×7来告诉C++将EDCOX1×10引用传递给正则表达式引擎。[0-9] 匹配一个数字。\\d 也应该有效,但可能不会。[0-9]+ 表示至少一个数字。如果可以接受Mem() ,则使用[0-9]* 。
正如你所看到的,这就像你在其他语言中找到的正则表达式(比如Java或C语言)。
现在,要考虑空白,请使用
请注意,
最后,为了包括浮点数,我们首先需要考虑是否可以接受
如果不是,那么
1 | std::regex regex("^[\\s]*Mem\\([0-9]+\\)\\s*=\\s*[0-9]+(\\.[0-9]+)?\\s*$"); |
注意,我们使用
如果您的编译器支持原始字符串(例如,Visual Studio 2013、GCC 4.5、Clang 3.0),则可以简化regex字符串:
1 | std::regex regex(R"(^[\s]*Mem\([0-9]+\)\s*=\s*[0-9]+(\.[0-9]+)?\s*$)") |
要提取有关匹配字符串的信息,可以使用
让我们从一个小小的改变开始:
1 2 3 4 5 | 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; |
注意三件事:
非常重要的是,定义组的括号没有转义,因为我们不希望它们与实际的括号字符匹配。我们实际上想要特殊的regex含义。
既然我们有了这些组,我们就可以使用它们:
1 2 3 | for (auto result : m) { std::cout << result << std::endl; } |
这将首先打印整个字符串,然后打印
换言之,