我想使用boost::sregex_token_iterator
解析文件。
不幸的是,我无法找到正确的正则表达式来提取FOO:BAR
形式的字符串。
以下代码示例仅在找到每行出现一次此类代码时才可用,但我希望每行支持多个这样的条目,理想情况下也是#' 39;
所以像这样的条目
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);
...
}
非常欢迎任何支持。
答案 0 :(得分:0)
您希望匹配一个或多个字符的序列,然后再跟:
,然后再添加一个或多个字符。
因此,您需要在调用boost::sregex_token_iterator
时将-1
替换为1
,以获取 Group 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+))"
的{{1}}模式,然后是该行的其余部分或匹配,并将您需要的模式捕获到第1组中。
查看std::regex
C++ example(您可以轻松调整Boost的代码):
#.*|(\w+:\w+)
答案 1 :(得分:0)
我建议您使用拆分来获取所需的值。
我首先要使用#
进行拆分。这将注释与行的其余部分分开。然后使用空格分割,将空格分开。在此之后,可以使用:
分割单个对。
如果出于某种原因必须使用正则表达式,则可以迭代匹配。在这种情况下,我将使用以下正则表达式:
(?:#(?:.*))*(\w+:\w+)\s*
此正则表达式将匹配每一对,直到找到注释。如果有评论,它将跳到下一个新行。