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

Get every regex match one by one with their positions

本文关键字:位置 一一 正则表达式      更新时间:2023-10-16

我需要获取所有正则表达式匹配项及其位置。

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

std::regex r("(a)|(b)|(c)");

这个输入文本:

std::string text("abcab");

现在我想在每个循环中循环匹配,我可以访问一个匹配中的所有匹配。所以在第一个循环中,我可以在0位置得到"a",在3位置得到"a"。在第二个循环中,它将是"b"在1,"b"位于4。在第三个循环中,它在位置2是"c"。我该怎么做?

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

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

这是一个C++演示:

#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;
}

您也可以考虑在声明regexp时使用std::regex_constants::optimize标志(请参阅Galik的注释)。