我有一个由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';
}

试过这个,但它返回3,5,7,9,11并也返回15,但是我不想要那样。有什么办法可以让我知道2的差在哪里被打破,比如15和11之间的差是4,所以忽略15。

最佳答案

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

您可以尝试以下here,它输出


#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;
}

关于c++ - 在C++中查找匹配项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43390317/

10-11 16:06