gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 17:57:30 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com