C++ 在c+中查找匹配项+;

C++ 在c+中查找匹配项+;,c++,regex,C++,Regex,我有一个由1和0组成的字符串,例如11101010101011101,我需要找到重复的01开始和结束的索引。在本例中是3和12 `1 1 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1` ^------REPETITIVE 01-------^ Starts here Ends here 如何找到索引3和12 string str = "1110

我有一个由1和0组成的字符串,例如
11101010101011101
,我需要找到重复的
01
开始和结束的索引。在本例中是3和12

      `1  1  1  0  1  0  1  0  1  0  1  0  1  1  1  0  1`
                ^------REPETITIVE 01-------^ 
               Starts here                Ends here
如何找到索引3和12

string str = "11101010101011101";
regex rx("01+");

vector<int> index_matches; // results saved here 
                           // (should be {2, 8}, but always get only {2})

for(auto it = std::sregex_iterator(str.begin(), str.end(), rx); it != std::sregex_iterator(); ++it)
    index_matches.push_back(it->position());

for(int n: index_matches)
{
    std::cout << n << '\n';
}
string str=“11101010101011101”;
正则表达式rx(“01+”);
向量索引_匹配;//结果保存在这里
//(应为{2,8},但始终仅获取{2})
for(auto it=std::sregex_迭代器(str.begin(),str.end(),rx);it!=std::sregex_迭代器();+it)
索引匹配。向后推(它->位置());
for(int n:索引_匹配)
{
std::cout使用
(?:01)+
而不是
01+
。后者匹配一个零,后跟一个或多个一,这不是您真正想要的

现在,
it
迭代器实际上为您提供了每个匹配的开始位置(
it->position()
)和长度(
it->length()
),并且您在那里有两个匹配项。因此,您最好在每次迭代中收集一对(使用开始位置和长度):

向量索引匹配;
for(auto it=std::sregex_迭代器(str.begin(),str.end(),rx);it!=std::sregex_迭代器();+it)
索引_匹配。向后推_(创建_对(it->position(),it->position()+it->length()-1));

演示:

如果您想要最长的匹配,您需要使用贪婪版本的正则表达式,还需要大括号
(01)+
,否则您将搜索01111…等等

您可以尝试以下方法,它可以输出

成功时间:0内存:16168信号:0

(3、12)

(15、16)

#包括
#包括
使用名称空间std;
int main(){
字符串str=“11101010101011101”;
正则表达式rx(“(01)+”,标准::正则表达式::扩展);
向量索引_matches;//结果保存在此处
for(auto it=std::sregex_迭代器(str.begin(),str.end(),rx);it!=std::sregex_迭代器();+it){
std::smatch match=*it;
索引匹配。向后推(创建匹配(it->position(),it->position()+match.length()-1));
}
用于(自动n:索引_匹配)

std::cout由于正则表达式返回以下所有事件(在本例中是整个“01010101”而不是前两个数字),因此可以尝试读取重复01模式的长度

迭代所有匹配项,然后返回条目最长的匹配项的起点和终点

我自己还没有运行过这段代码,但它应该接近解决方案:

auto words_begin = sregex_iterator(str.begin(), str.end(), rx);
auto words_end = sregex_iterator();
int length = 0;
int start = 0;
int end = 0;
for (auto i = words_begin; i != words_end; ++i) {
    if (i->str().length() > length) {
      length = i->str().length();
      start = i -> position();
      end = start + length;
    }
}

编辑:我读了你的文章,因为你需要最长的出现时间。否则,我的方法可能是错误的。

不太清楚你想如何实际存储这些值。作为开始/结束匹配位置对?它不应该输出2,而是3,因为这是01的第一次出现的索引。实际上,我想将3、12作为一对存储,最后的15、16作为一对存储作为另一对。OP需要得到3和12,而不是3和15。开始-结束位置值不应该分组吗?我认为OP需要得到所有匹配的开始/结束位置。你的正则表达式是正确的,但它不能解决代码问题。@WiktorStribiżew:哦,我明白了。我很快会更新答案。是的,这只返回3和15,我不明白12
#include <iostream>
#include <regex>
using namespace std;

int main() {
    string str = "11101010101011101";
    regex rx("(01)+", std::regex::extended);

    vector<pair<int, int>> index_matches; // results saved here 


    for(auto it = std::sregex_iterator(str.begin(), str.end(), rx); it != std::sregex_iterator(); ++it) {

        std::smatch match = *it; 
        index_matches.push_back(make_pair<int, int>(it->position(), it->position() + match.length() -1));
    }

    for(auto n: index_matches)
        std::cout << "(" << n.first << ", " << n.second << ")" << std::endl;

    return 0;
}
auto words_begin = sregex_iterator(str.begin(), str.end(), rx);
auto words_end = sregex_iterator();
int length = 0;
int start = 0;
int end = 0;
for (auto i = words_begin; i != words_end; ++i) {
    if (i->str().length() > length) {
      length = i->str().length();
      start = i -> position();
      end = start + length;
    }
}