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

时间:2017-07-31 10:15:42

标签: c++ regex boost

我想使用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);
  ...
}

非常欢迎任何支持。

2 个答案:

答案 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*

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