我有以下正则表达式:([0-9]+)\/([0-9]*)\/([0-9]*)
(在我的代码中正确地转义了)。如您所见,它具有三个捕获组:一个捕获组必须至少包含一个数字,另外两个捕获组(可能为空)。
我正在尝试在一个字符串上运行它,该字符串应该为整个正则表达式产生三个匹配项。例如:
f 5/1/1 1/2/1 4/3/1
在这种情况下,正则表达式的结果应为:
比赛1:5/1/1,组1:5,组2:1,组3:1
比赛2:1/2/1,小组1:1,小组2:2,小组3:1
比赛3:4/3/1,组1:4,组2:3,组3:1
但是,据我了解,C ++ 11无法同时返回匹配项和组。
如果我要运行以下代码,
std::smatch matchs;
std::regex_search("f 5/1/1 1/2/1 4/3/1", matches "([0-9]+)\\/([0-9]*)\\/([0-9]*)");
matches
将包含10个元素:matches[0]
将是从5到末尾的所有内容,而matches[1]
-matches[9]
将具有捕获组。但是我不仅在尝试获取分组,而且还在尝试获取每个匹配项(最好是按按比赛组织的分组)。
如:matches[1]
将具有5/1/1
,matches[2]
将具有1/2/1
,而matches[3]
将具有4/3/1
。然后,在类似(例如)的内容中:groups[n]
将具有相应的组。或者,如果可能的话,matches[1].groups
将具有在比赛中找到的组。
这是正确的吗?和/或有什么方法可以轻松地同时获得比赛和比赛分组?
注意:这不是重复的,因为其他问题似乎在问多个匹配或组,而不是同时出现。
答案 0 :(得分:1)
完成的方法是使用具有以下内容的regex_search()
进行迭代:
许多原型。
正则表达式迭代器的内容在后台恢复为原来的状态。
你去了。
关于如何在C ++中使用正则表达式的更多答案,
让我知道。
std::string::const_iterator start = str.begin();
std::string::const_iterator end = str.end();
std::smatch m;
std::regex rx( "([0-9]+)/([0-9]*)/([0-9]*)" );
while ( std::regex_search( start, end, m, rx ) )
{
std::string sWholeMatch = m[0].str();
std::string sGrp1 = m[1].str();
std::string sGrp2 = m[2].str();
std::string sGrp3 = m[3].str();
int lenGrp1 = sGrp1.length();
int lenGrp2 = sGrp2.length();
int lenGrp3 = sGrp3.length();
start = m[0].second;
}