c++ - 如何获得 std::regex 的所有可能匹配项

标签 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;
}

给出输出:

0: 2
1: 2
2: 25

但找不到第三个 2: 2。我更喜欢使用正则表达式,因为 O(n) 同时搜索多个标记的复杂性。

更新:

也许将标记列表拆分为不可前缀的列表并创建多个正则表达式?例如:(2|4|25|45|251|455|267) => (2|4), (25|45|267) , (251|455) 这会增加复杂度,比如 O(n log(m))

更新 2:

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

最佳答案

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

您的正则表达式搜索“2”“25”的子字符串。现在,您可以使用 sregex_iterator 开始搜索。它从字符串的第一个符号开始,并尝试找到与您的正则表达式匹配的内容。如果有匹配,则“记录”,迭代器前进到匹配后的位置。如果没有匹配项,则迭代器向前推进 1 个位置。这个过程一直持续到到达字符串的末尾。

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

关于c++ - 如何获得 std::regex 的所有可能匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33142488/

相关文章:

c++ - 调用 system() 的行为与在命令提示符 (cmd) 中的行为不同

c++ - 二叉树用零填充

java - 用键值对分隔字符串

Javascript正则表达式验证1945年至当前年份之间的输入年份

c++ - 如何静态检查模板的类型 T 是否为 std::vector<U>,其中 U 为 float、double 或 integral

c++ - 在cuda中有更好/更清洁/更优雅的malloc和free方式吗?

c++ - 如何找到小于或等于 X 的最大值和大于或等于 X 的最小值?

regex - 需要正则表达式 - 没有美分的美元

c++ - 对象传播

c++ - 如何使用 C++11 显式模板来减少二进制大小?