C ++正则表达式匹配和分组

时间:2019-09-15 20:39:32

标签: c++ regex c++11

我有以下正则表达式:([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/1matches[2]将具有1/2/1,而matches[3]将具有4/3/1。然后,在类似(例如)的内容中:groups[n]将具有相应的组。或者,如果可能的话,matches[1].groups将具有在比赛中找到的组。

这是正确的吗?和/或有什么方法可以轻松地同时获得比赛和比赛分组?

注意:这不是重复的,因为其他问题似乎在问多个匹配组,而不是同时出现。

1 个答案:

答案 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;
}