如何获得std::regex的所有可能匹配

How to get all possible matches of std::regex

本文关键字:有可能 regex 何获得 std      更新时间:2023-10-16

我想找到所有可能的匹配正则表达式,这是怎么可能的?

regex rx("(2|25)");
string s = "2225";
for (sregex_iterator it(s.begin(), s.end(), rx), end; it != end; ++it) {
    cout << it->position() << ": " << it->str() << endl;
}

给输出:

0: 2
1: 2
2: 25

但无法准确找到第三个2: 2。我更喜欢使用regex,因为同时搜索多个令牌的O(n)复杂性。

更新:

也许分割令牌列表到不可前缀列表并创建几个正则?例如:(2|4|25|45|251|455|267) => (2|4), (25|45|267), (251|455)这将使复杂度增加到类似O(n log(m))

更新2:

请提供基于stl的简短算法,将令牌向量分割为不可前缀向量来回答这个问题。

我不认为这是可能的迭代器和一个单一的正则表达式。下面是它的工作原理。

您的regexp搜索的子字符串是"2""25"。现在,从sregex_iterator开始搜索。它从字符串的第一个符号开始,并尝试查找与正则表达式的匹配。如果有匹配,则"记录",并将迭代器推进到匹配后的位置。如果没有匹配,迭代器向前移动1位。这个过程一直持续到到达字符串的末尾。

现在,每次它找到一个匹配,它将尝试从你的正则表达式中找到最好的(即最长的)匹配。因此,如果一个子字符串同时匹配225,它将使用25,因为它更长。所以我说你需要2个正则表达式

您无法获得第三个'2',因为正则表达式总是返回最长的匹配。为了获得"所有可能的匹配",您需要运行查询两次,因为2包含在25中。