C++ 让每个正则表达式与它们的位置一一匹配

C++ 让每个正则表达式与它们的位置一一匹配,c++,regex,C++,Regex,我需要得到所有的正则表达式匹配和它们的位置 例如,我有一个正则表达式: std::regex r("(a)|(b)|(c)"); 此输入文本: std::string text("abcab"); 现在我想在每个循环中循环匹配,我可以从一个匹配中访问所有匹配。所以在第一个循环中,我可以在位置0得到“a”,在位置3得到“a”。在第二个循环中,1处为“b”,4处为“b”。在第三个循环中,第二个位置是“c”。我该怎么做 目前,我分别拥有每个regex部分(regex用于(a)、(b)和(c)),并

我需要得到所有的正则表达式匹配和它们的位置

例如,我有一个正则表达式:

std::regex r("(a)|(b)|(c)");
此输入文本:

std::string text("abcab");
现在我想在每个循环中循环匹配,我可以从一个匹配中访问所有匹配。所以在第一个循环中,我可以在位置0得到“a”,在位置3得到“a”。在第二个循环中,1处为“b”,4处为“b”。在第三个循环中,第二个位置是“c”。我该怎么做


目前,我分别拥有每个regex部分(regex用于
(a)
(b)
(c)
),并逐一查看它们。但是它们有很多,所以我正在寻找更好/更快的解决方案。

您可以声明字符串向量来存储捕获的值,然后检查哪个可选分支匹配,并将其添加到相应的向量中

以下是一份:

#包括
#包括
#包括
使用名称空间std;
int main(){
标准:正则表达式r(“(a)|(b)|(c)”);
std::string s=“abcab”;
std::vector astrings;//将向量声明为
std::vector bstrings;//填充内容
std::vector cstrings;//捕获组的
for(std::sregx_迭代器i=std::sregx_迭代器(s.begin(),s.end(),r);
i!=std::sregex_迭代器();
++(一)
{
std::smatch m=*i;
如果(m[1].匹配){//检查组1是否匹配,以及
astrings.push_back(m[1].str());//将值放入字符串向量中
}
else如果(m[2].匹配){//检查组2是否匹配,并且
bstrings.push_back(m[2].str());//将值放入b字符串向量中
}
else如果(m[3].匹配){//检查组3是否匹配,以及
cstrings.push_back(m[3].str());//将值放入c字符串向量中
}
}
//打印向量-演示
适用于(自动i:收敛)

std::cout类似于?@WiktorStribiżew我需要知道当前匹配的匹配号。我不介意有多个正则表达式,但如果它们是分开的,我还需要确保没有相同的匹配。例如,我首先查找“ab”,然后查找“a”和“b”,因此,在每个匹配中,我需要遍历存储匹配的整个容器,以确保新匹配尚未(部分)完成在它里面。好的,我想你需要声明字符串向量来存储捕获的值,然后检查哪个可选分支匹配,并将其添加到相应的向量中。类似于。这听起来像是一个计划吗?谢谢。这是可行的,但仍然比我需要的慢。我有60多个正则表达式,输入文本可以是数千行因此,我必须用其他方法来解决它。但是,谢谢!:)好吧,也许,对于您的任务来说,regex不是最好的工具。或者,正如我所怀疑的,问题出在您的一个或几个模式中,可能会导致性能问题(这是regexp的一个常见问题)。
#include <string>
#include <iostream>
#include <regex>
using namespace std;

int main() {
    std::regex r("(a)|(b)|(c)");
    std::string s = "abcab";
    std::vector<std::string> astrings; // Declare the vectors to 
    std::vector<std::string> bstrings; // populate with the contents
    std::vector<std::string> cstrings; // of capturing groups

    for(std::sregex_iterator i = std::sregex_iterator(s.begin(), s.end(), r);
           i != std::sregex_iterator();
           ++i)
    {
        std::smatch m = *i;
        if (m[1].matched) {                 // Check if Group 1 matched and 
            astrings.push_back(m[1].str()); // Put a value into a string vector
        }
        else if (m[2].matched) {            // Check if Group 2 matched and 
            bstrings.push_back(m[2].str()); // Put a value into b string vector
        }
        else if (m[3].matched) {             // Check if Group 3 matched and 
            cstrings.push_back(m[3].str());  // Put a value into c string vector
        }
    }

    // Printing vectors - DEMO
    for (auto i: astrings)
        std::cout << i << ' ';
    std::cout << "\n";
    for (auto i: bstrings)
        std::cout << i << ' ';
    std::cout << "\n";
    for (auto i: cstrings)
        std::cout << i << ' ';

    return 0;
}