C++中使用regex_search查找多个组的问题

“adsfaf-ad4235sfasdf-adf56adf-fdfg-asf”类似这样一组用横杠隔开的字符串,横杠的数量不确定,要把所有两个横杠之间的内容分别取出来。代码... “adsfaf-ad4235sfasdf-adf56adf-fdfg-asf”类似这样一组用横杠隔开的字符串,横杠的数量不确定,要把所有两个横杠之间的内容分别取出来。代码如下:
int main()
{
regex r("((?<=-)[^-]+)");
string in(adsfaf-ad4235sfasdf-adf56adf-fdfg-asf);
cmatch what;
if(regex_search(in.c_str(),what,r))
{
for(int i=0;i<what.size();i++)
{
cout<<"str:"<<what[i].str()<<endl;
}
}
return 0;
}
为什么输出的只有第一个横杠之后和第二个横杠之间的内容?
展开
 我来答
cqdjyy01234
2014-06-27 · TA获得超过1147个赞
知道小有建树答主
回答量:267
采纳率:50%
帮助的人:301万
展开全部

你想要的大概是下面的代码(既然在用正则表达式,那编译器应该支持c++11咯?)

#include <regex>
#include <string>
#include <iostream>

int main(){
    std::regex r("([^-]+)-?");
    std::string in("adsfaf-ad4235sfasdf-adf56adf-fdfg-asf");
    for (std::sregex_iterator p(in.cbegin(), in.cend(), r), q; p != q; ++p){
        std::cout << "str: " << p->format("$1") << "\n";
    }

    return 0;
}

 你调用的函数只匹配一次,所以只输出第一个字符串。

更多追问追答
追问
感谢回答,我用的是VC6.0。平时也很少写程序,所以有不少地方都是一知半解,基础也很差。regex是我在网上下的boost的库然后在VC6上编译了一下。这段代码在VC6上能用么? for循环条件里边的那个P是什么意思?
追答

boost库使用下面的代码

#include <boost/regex.hpp>
#include <string>
#include <iostream>

int main(){
    boost::regex r("([^-]+)-?");
    std::string in("adsfaf-ad4235sfasdf-adf56adf-fdfg-asf");
    for (boost::sregex_iterator p(in.cbegin(), in.cend(), r), q; p != q; ++p){
        std::cout << "str: " << p->format("$1") << "\n";
    }

    return 0;
}

p的含义参见boost库的文档http://www.boost.org/doc/libs/1_55_0/libs/regex/doc/html/boost_regex/ref/regex_iterator.html

DoramiHe
2017-08-19 · 知道合伙人互联网行家
DoramiHe
知道合伙人互联网行家
采纳数:25335 获赞数:59534
2011年中山职业技术学院毕业,现担任毅衣公司京东小二

向TA提问 私信TA
展开全部
string aa1 = Regex.Replace(" aa bb cc ".Trim(), "\\s+"," ",RegexOptions.IgnoreCase);
参数2为规则
参数3就是把符合要求的字符串替换成什么字符串,这里为一个空格,
参数4为不区分大小写
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式