如何获得std::regex的所有可能匹配
How to get all possible matches of std::regex
我想找到所有可能的匹配正则表达式,这是怎么可能的?
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))
请提供基于stl的简短算法,将令牌向量分割为不可前缀向量来回答这个问题。
我不认为这是可能的迭代器和一个单一的正则表达式。下面是它的工作原理。
您的regexp搜索的子字符串是"2"或"25"。现在,从sregex_iterator
开始搜索。它从字符串的第一个符号开始,并尝试查找与正则表达式的匹配。如果有匹配,则"记录",并将迭代器推进到匹配后的位置。如果没有匹配,迭代器向前移动1位。这个过程一直持续到到达字符串的末尾。
现在,每次它找到一个匹配,它将尝试从你的正则表达式中找到最好的(即最长的)匹配。因此,如果一个子字符串同时匹配2
和25
,它将使用25
,因为它更长。所以我说你需要2个正则表达式
您无法获得第三个'2',因为正则表达式总是返回最长的匹配。为了获得"所有可能的匹配",您需要运行查询两次,因为2包含在25中。
相关文章:
- 有可能在Armadillo中复制MATLAB circshift方法吗
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 有可能使shared_ptr协变吗
- 有可能在信号处理程序中设置promise吗
- 是否有可能实现O(N)时间和O(1)空间解决方案,以实现C++中的字符串循环移位
- 是否有可能构建面向Linux和Windows的.Net Core C++ / CLI应用程序?
- 是否有可能使用debug_info获取ELF文件的源代码?
- C++,是否有可能/如何定义在.h和.cpp源文件中调用函数的类构造函数
- 有可能在C++中有类的查找表吗
- 是否有可能让 c++ dll 在后台运行 python 程序并让它填充向量图?如果是这样,如何?
- 向量的大小是否有可能为 1 但其中的元素数量为零?
- 是否有可能编写新的叮当声现代化规则?
- 是否有可能通过指向另一个未关联的子对象的指针来获取指向一个子对象的指针?
- 是否有可能通过演绎指南实现整个 std::make_tuple 功能?
- 是否有可能在没有复制的情况下传递 std::vector<int> 作为参数来获得 std::vector<std::array<int, 3>>?
- 是否有可能具有放入容器的移动操作的类型?
- 是否有可能通过溢出 C 中的第一个元素来写入数组第二个元素
- 声明是否有可能逃脱其封闭的名称空间
- git-是否有互联网上某处所有可能错误的列表
- 是否有可能有一个派生类继承最终函数但创建相同的函数(而不是重写)