我知道我应该得到的文字的确切格式。特别是,它应该将正则表达式与可变数量的组匹配。
我想使用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)
谢谢!
答案 0 :(得分:0)
(?=^([a-zA-Z]*)(?:\,\d+)+$)^.*?(?:((?:\,\d+)+)).*?$
你可以使用它。这将首先使用lookahead验证,然后返回2组。
1)包含姓名
2)包含所有其余的整数(这可以很容易地拆分)或者你可以在这里使用re.findall
虽然它没有完全回答你的问题,但它可能会有所帮助。
看看。
答案 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
,但我不相信生成的代码更简单。