在c ++中查找匹配项

时间:2017-04-13 10:53:13

标签: 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`
 ^ ------重复01 ------- ^
从这里开始在这里结束
  




如何找到索引3和12




  string str =“11101010101011101”;
 regex rx(“01 +”);

 vector< int> index_matches; //结果保存在这里
 //(应该是{2,8},但总是得到{2})

 for(auto it = std :: sregex_iterator(str.begin(),str.end(),rx );它!= 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。




3 个答案:

答案 0 :(得分:3)

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

您可以尝试以下here,输出

  

成功时间:0记忆:16168信号:0

     

(3,12)

     

(15,16)

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

答案 1 :(得分:1)

使用(?:01)+代替01+。后者匹配一个零,后跟一个或多个,这不是你真正想要的。

现在,it迭代器实际上为您提供每个匹配的起始位置(it->position())和长度(it->length())。而且你在那里有两场比赛。因此,您最好在每次迭代时收集(使用起始位置和长度)

vector<pair<int, int>> index_matches;
for(auto it = std::sregex_iterator(str.begin(), str.end(), rx); it != std::sregex_iterator(); ++it)
    index_matches.push_back(make_pair(it->position(), it->position() + it->length() - 1));

演示:https://ideone.com/GaV428

答案 2 :(得分:1)

由于你的正则表达式会向你返回以下所有出现的情况(在这种情况下整个&#34; 01010101&#34;而不是前两位数字,你可以尝试读取重复01模式的长度。< / p>

迭代所有匹配,然后返回具有最长条目的匹配的开始和结束点。

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

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;
    }
}
编辑:我读了你的帖子,因为你需要最长的出现时间。否则,我的方法可能是错误的。