我刚刚开始学习如何使用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()
and 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()
and 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)