C ++正则表达式使用regex_search()提取所有子字符串 [英] c++ regex extract all substrings using regex_search()
问题描述
我是C ++正则表达式的新手。我有一个字符串 {1,2,3},我想提取数字1 23。我以为我应该使用regex_search,但是失败了。
I am new to c++ regex. I have a string "{1,2,3}" and I want to extract the numbers 1 2 3. I thought I should use regex_search but it failed.
#include<iostream>
#include<regex>
#include<string>
using namespace std;
int main()
{
string s1("{1,2,3}");
string s2("{}");
smatch sm;
regex e(R"(\d+)");
cout << s1 << endl;
if (regex_search(s1,sm,e)){
cout << "size: " << sm.size() << endl;
for (int i = 0 ; i < sm.size(); ++i){
cout << "the " << i+1 << "th match" <<": "<< sm[i] << endl;
}
}
}
结果:
{1,2,3}
size: 1
the 1th match: 1
推荐答案
std :: regex_search 仅在找到第一个匹配项后返回。
std::regex_search returns after only the first match found.
std :: smatch 给您的是正则表达式中所有匹配的组。您的正则表达式仅包含一组,因此 std :: smatch 中只有一项
What std::smatch gives you is all the matched groups in the regular expression. Your regular expression only contains one group so std::smatch only has one item in it.
如果要查找所有匹配项,则需要使用 std :: sregex_iterator 。
If you want to find all matches you need to use std::sregex_iterator.
int main()
{
std::string s1("{1,2,3}");
std::regex e(R"(\d+)");
std::cout << s1 << std::endl;
std::sregex_iterator iter(s1.begin(), s1.end(), e);
std::sregex_iterator end;
while(iter != end)
{
std::cout << "size: " << iter->size() << std::endl;
for(unsigned i = 0; i < iter->size(); ++i)
{
std::cout << "the " << i + 1 << "th match" << ": " << (*iter)[i] << std::endl;
}
++iter;
}
}
输出:
{1,2,3}
size: 1
the 1th match: 1
size: 1
the 1th match: 2
size: 1
the 1th match: 3
end
迭代器是设计默认构造的,因此当<$时等于 iter
c $ c> iter 已用完比赛。注意,在循环的底部,我执行 ++ iter
。将 iter
移至下一场比赛。如果没有更多匹配项,则 iter
与默认构造的 end
具有相同的值。
The end
iterator is default constructed by design so that it is equal to iter
when iter
has run out of matches. Notice at the bottom of the loop I do ++iter
. That moves iter
on to the next match. When there are no more matches, iter
has the same value as the default constructed end
.
另一个显示子匹配项(捕获组)的示例:
int main()
{
std::string s1("{1,2,3}{4,5,6}{7,8,9}");
std::regex e(R"~((\d+),(\d+),(\d+))~");
std::cout << s1 << std::endl;
std::sregex_iterator iter(s1.begin(), s1.end(), e);
std::sregex_iterator end;
while(iter != end)
{
std::cout << "size: " << iter->size() << std::endl;
std::cout << "expression match #" << 0 << ": " << (*iter)[0] << std::endl;
for(unsigned i = 1; i < iter->size(); ++i)
{
std::cout << "capture submatch #" << i << ": " << (*iter)[i] << std::endl;
}
++iter;
}
}
输出:
{1,2,3}{4,5,6}{7,8,9}
size: 4
expression match #0: 1,2,3
capture submatch #1: 1
capture submatch #2: 2
capture submatch #3: 3
size: 4
expression match #0: 4,5,6
capture submatch #1: 4
capture submatch #2: 5
capture submatch #3: 6
size: 4
expression match #0: 7,8,9
capture submatch #1: 7
capture submatch #2: 8
capture submatch #3: 9
这篇关于C ++正则表达式使用regex_search()提取所有子字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!