VC里正则表达式匹配 惰性匹配的问题

wal199005 2015-05-30 05:43:41
正则表达式为 boost::regex w("(\\w+\\*)+?"); //惰性匹配

\w+\* 匹配以星号结尾的字符串。

(\w+\*)+ 匹配多个以星号结尾的字符串。

(\w+\*)+? 惰性匹配多个以星号结尾的字符串。

如果输入的字符串为temp:254424501*239184501*

如何把两个以星号结尾的子串都匹配出来。

regex_match(temp,smatch,w)

使得
smatch[0] = 254424501*239184501*;
smatch[1] = 254424501*;
smatch[2] = 239184501*;

现在的匹配结果为:
smatch[0] = 254424501*239184501*;
smatch[1] = 239184501*;
这是为什么呀





...全文
319 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
iyomumx 2015-06-01
  • 打赏
  • 举报
回复
sregex_iterator语义应该很清晰了,具体用法请参考文档。 *m是一个smatch,(*m)[0]是代表其所有捕获的submatch,如何转换为string请参考smatch和submatch的文档。 运行时出错请调试。
wal199005 2015-06-01
  • 打赏
  • 举报
回复
引用 1 楼 iyomumx 的回复:
你的正则表达式里只有一个子表达式,当然只能有smatch[1],再怎么改也不会出现smatch[2]的 可以考虑这样改:
    regex w("\\w+\\*");
    smatch match;
    string tmp = "temp:254424501*239184501*";
    auto m_begin = sregex_iterator(tmp.begin(), tmp.end(), w);
    auto m_end = sregex_iterator();
    for (sregex_iterator m = m_begin; m != m_end; ++m)
    {
        cout << (*m)[0] << endl;
    }
谢谢你的回复 我不太懂迭代器 下来看了看 auto m_end = sregex_iterator(); 这句话我有些不懂,请问这样就是初始化了吗?m_end就是这个迭代器的最后一个元素的下一个位置吗? 我定义了一个动态数组:std::vector<string>slist; 我想把匹配的子串都存入这个数组,slist.push_back((*m)[0]); 这样写对吗?打开有的文件(含字符串)可以运行,有的文件就会中止。 *m 是返回迭代器m所指向的元素的引用,(*m)[0]是什么意思 不好意思,第一次用迭代器,不太了解
赵4老师 2015-06-01
  • 打赏
  • 举报
回复
提醒楼主: 正则表达式不是万能的;有限状态自动机是万能的。
taodm 2015-05-30
  • 打赏
  • 举报
回复
汗,你根本没有第二个捕获组。 你需要的是历史捕获,这个boost::regex默认不支持,需要自己重新编译regex库,boost库文档里都有说明。 简单点,你应该捕获后对捕获结果重新分解 复杂点,重新编译regex库 折腾点,改用boost::xpressive库,它直接支持这个。
iyomumx 2015-05-30
  • 打赏
  • 举报
回复
你的正则表达式里只有一个子表达式,当然只能有smatch[1],再怎么改也不会出现smatch[2]的 可以考虑这样改:
    regex w("\\w+\\*");
    smatch match;
    string tmp = "temp:254424501*239184501*";
    auto m_begin = sregex_iterator(tmp.begin(), tmp.end(), w);
    auto m_end = sregex_iterator();
    for (sregex_iterator m = m_begin; m != m_end; ++m)
    {
        cout << (*m)[0] << endl;
    }

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧