需要支持定义正确的正则表达式

need support defining the right regex

本文关键字:正则表达式 定义 支持      更新时间:2023-10-16

我想使用boost::sregex_token_iterator解析一个文件。

不幸的是,我找不到正确的正则表达式来提取FOO:BAR形式的字符串。

下面的代码示例仅在每行找到一个这样的出现时才可用,但我想支持每行多个此类条目,理想情况下也是"#"之后的注释

所以像这样的条目

AA:BB CC:DD EE:FF #this is a comment

应生成 3 个已识别的令牌(AA:BB、CC:DD、EE:FF(

boost::regex re("((\W+:\W+)\S*)+");
boost::sregex_token_iterator i(line.begin(), line.end(), re, -1), end;
for(; i != end; i++){
std::stringstream ss(*i);
...
}

非常欢迎任何支持。

我建议你使用拆分来获取你需要的值。

我将首先使用#进行拆分。这会将注释与行的其余部分分开。然后使用空格拆分,将配对分开。在此之后,可以使用:拆分单个对。

如果出于某种原因您必须使用正则表达式,则可以迭代匹配项。在这种情况下,我将使用以下正则表达式:

(?:#(?:.*))*(w+:w+)s*

此正则表达式将匹配每对,直到找到注释。如果有注释,它将跳到下一个新行。

您希望匹配 1 个或多个单词字符的序列,后跟:,然后再次具有 1 个或多个单词字符。

因此,您需要在调用boost::sregex_token_iterator中将-1替换为1以获取组 1文本块并将您使用的正则表达式替换为w+:w+模式:

boost::regex re(R"(#.*|(w+:w+))");
boost::sregex_token_iterator i(line.begin(), line.end(), re, 1), end;

请注意,R"(#.*|(w+:w+))"是一个原始字符串文本,它实际上表示#.*|(w+:w+)模式与#匹配,然后表示行的其余部分或匹配并将所需的模式捕获到组 1 中。

请参阅std::regexC++示例(您可以轻松调整 Boost 的代码(:

#include <string>
#include <iostream>
#include <regex>
using namespace std;
int main() {
std::regex r(R"(#.*|(w+:w+))");
std::string s = "AA:BB CC:DD EE:FF #this is a comment XX:YY";
for(std::sregex_iterator i = std::sregex_iterator(s.begin(), s.end(), r);
i != std::sregex_iterator();
++i)
{
std::smatch m = *i;
std::cout << m[1].str() << 'n';
}
return 0;
}