在C ++中将字符串解析为未知数量的正则表达式组

时间:2014-08-22 06:09:23

标签: c++ regex parsing

我知道我应该得到的文字的确切格式。特别是,它应该将正则表达式与可变数量的组匹配。

我想使用C ++正则表达式库来确定(a)它是否是有效文本,以及(b)将这些组解析为向量。我怎样才能做到这一点?我可以在网上找到做(a)的例子,但不能做(b)。

#include <string>
#include <regex>
#include <vector>

bool parse_this_text(std::string & text, std::vector<std::string> & group) {
    // std::string text_regex = "^([a-z]*)(,[0-9]+)*$"

    // if the text matches the regex, return true and parse each group into the vector
    // else return false
    ???
}

以下代码行返回预期结果。

std::vector<std::string> group;

parse_this_text("green,1", group);
// should return true with group = {"green", ",1"};

parse_this_text("yellow", group);
// should return true with group = {"yellow"};

parse_this_text("red,1,2,3", group);
// should return true with group = {"red", ",1", ",2", ",3"};

parse_this_text("blue,1.0,3.0,1,a", group);
// should return false (since it doesn't match the regex)

谢谢!

2 个答案:

答案 0 :(得分:0)

   (?=^([a-zA-Z]*)(?:\,\d+)+$)^.*?(?:((?:\,\d+)+)).*?$

你可以使用它。这将首先使用lookahead验证,然后返回2组。

1)包含姓名

2)包含所有其余的整数(这可以很容易地拆分)或者你可以在这里使用re.findall

虽然它没有完全回答你的问题,但它可能会有所帮助。

看看。

http://regex101.com/r/wE3dU7/3

答案 1 :(得分:0)

一种选择是扫描字符串两次,第一次检查有效性,第二次将其拆分为字段。通过OP中的示例,一旦您知道它是正确的,您就不需要regexen来分割线;你可以简单地用逗号分开。但是为了说明,您可以使用std::regex_token_iterator(假设您有一个支持这些的C ++库),如下所示:

bool parse_this_text(const std::string& s, std::vector<std::string>& result) {
  static const std::regex check("[[:alpha:]][[:alnum:]]*(,[[:digit:]])*",
                                std::regex_constants::nosubs);
  static const std::regex split(",");
  if (!std::regex_match(s, check)) 
    return false;
  std::sregex_token_iterator tokens(s.begin(), s.end(), split, -1); 
  result.clear();
  std::copy(tokens, std::sregex_token_iterator(), std::back_inserter(result));
  return true;
}

对于更复杂的情况或不希望进行双重扫描的应用程序,您可以使用对std::regex_search()的连续调用进行标记,将前一个匹配的结尾作为起点,并std::regex_constants::continuous为比赛标志;这将在上一场比赛后将每次搜索锚定到角色。在这种情况下,您可以使用std::regex_iterator,但我不相信生成的代码更简单。