Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何获取std::regex的所有可能匹配项_C++_Regex_C++11_Stl - Fatal编程技术网

C++ 如何获取std::regex的所有可能匹配项

C++ 如何获取std::regex的所有可能匹配项,c++,regex,c++11,stl,C++,Regex,C++11,Stl,我想找到所有可能的正则表达式匹配项,怎么可能 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; } 但无法准确地找到第三个2:2。我更喜欢使用正则表达

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

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;
}
但无法准确地找到第三个
2:2
。我更喜欢使用正则表达式,因为同时搜索多个令牌的复杂性

更新:

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

更新2:


请提供将标记向量拆分为不可前缀向量的基于STL的简短算法来回答这个问题。

我认为使用迭代器和单个regexp是不可能的。下面是它的工作原理

您的regexp搜索的子字符串为“2”或“25”。现在,使用
sregex\u迭代器开始搜索。它以字符串的第一个符号开始,并尝试查找与正则表达式匹配的项。如果存在匹配,则会“记录”,迭代器将前进到匹配后的位置。如果没有匹配项,迭代器将前进1个位置。此过程将继续,直到到达字符串的末尾


现在,每次找到匹配项时,它都会尝试从正则表达式中找到最佳(即最长)匹配项。因此,如果子字符串同时匹配
2
25
,则需要
25
,因为它较长。所以我认为您需要2个正则表达式。

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

如果您只想在
2
上匹配,为什么要将
|25
用作正则表达式的一部分?@Phylogenesis我想找出
O(n)的所有4个匹配项
complexity:)我相信你不能在两个不同的匹配组中匹配同一个字符(即,你不能将
2
作为
25
的一部分,但也不能单独匹配)。@k06a在这种情况下,为什么要使用regex?这就变成了一个简单的文本搜索问题。正则表达式不仅会降低算法的复杂性。您必须检查
n
字符中的每一个是否都是
m
不同字符串的开头。根据搜索空间的性质,您将很难找到一种比
O(nm)
更有效的算法(您真正希望的最好方法是进行一些预计算以找到匹配的前缀)。请帮助我避免
m
正则表达式,每种算法只包含一个标记:)复杂性增加到
O(nm)
:(我认为它实际上并不匹配最长的匹配,而是匹配第一个匹配。交替的顺序很重要:看这个。@系统发育,这很有趣,因为在我的机器上,结果正好相反(
rx1
发现
2 25
rx2
发现
2
std:(基本)如果我没有弄错的话,regex
应该默认使用ECMAScript规则,这应该更喜欢第一个匹配选项。如果使用extended/POSIX,它将更喜欢较长的IIRC。试试这个:@k06a,如果子表达式不是任何其他子表达式的前缀,您可以对它们进行分组,例如,您可以对
3 | 45
进行分组,因为
3
不是
45的前缀
0: 2
1: 2
2: 25