繁体   English   中英

使用regex_search获取所有匹配的索引?

[英]Get the index of all matches using regex_search?

我刚开始学习如何使用regex进行字符串处理( C++11新功能)。 如果下面的问题太傻了,请原谅我。

目前我应用以下代码来获取所有匹配的索引:

string str = "aaabxxxaab";
regex rx("ab");

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

int track = 0;
smatch sm;
while (regex_search(str, sm, rx))
{
    index_matches.push_back(track+sm.position());

    string tmp = sm.suffix().str();
    track += str.length() - tmp.length(); // update base index

    str = tmp;
}

它工作正常,但我必须每次手动更新track (基本索引)以使其正常工作。

同时,我注意到已经有smatch::size()smatch::position() ,我想用它们来实现目标。 以下是我想将它们组合在一起但不能工作的代码(即总是只得到{2} )。

string str = "aaabxxxaab";
regex rx("ab");

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

smatch sm;
regex_search(str, sm, rx);
for (int i=0; i<sm.size(); i++)
    index_matches.push_back(sm.position(i));

有人能告诉我如何正确使用smatch::size()smatch::position()来获取所有匹配的索引吗?

单次执行regex_search只会给您一个匹配(您查询的大小和位置)。

您可以:更改正则表达式以多次匹配子字符串(然后循环捕获组),或者只使用regex_iterator

string str = "aaabxxxaab";
regex rx("ab");

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());
}

在线演示: http//coliru.stacked-crooked.com/a/4d6e1a44b60b7da5

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM