免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 24698097 | 回复: 24698097
打印 上一主题 下一主题

[C++] c++11 g++4.8 regex如何使用? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-25 21:50 |只看该作者 |倒序浏览
  1. #include <regex>
  2. #include <iostream>
  3. #include <string>
  4. using namespace std;

  5. int main(int argc,char* argv[])
  6. {
  7.         string str;
  8.         regex reg("(\\+|-)?[[:digit:]]+",regex_constants::extended);
  9.         cin>>str;
  10.         while(str!="q")
  11.         {
  12.                 if(regex_match(str,reg))
  13.                 {
  14.                         cout<<"Num:"<<str<<endl;
  15.                 }
  16.                 else
  17.                 {
  18.                         cout<<"Not num: "<<str<<endl;
  19.                 }
  20.                 cin>>str;
  21.         }
  22.         return 0;
  23. }
复制代码
编译没问题:
g++ -g -Wall -std=c++11 test_regex.cpp
运行错误:
./a.out

  1. terminate called after throwing an instance of 'std::regex_error'
  2.   what():  regex_error
  3. Aborted (core dumped)
复制代码
什么情况啊?

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
2 [报告]
发表于 2013-08-26 09:56 |只看该作者
回复 1# leewon1988


    你的正规表达式写的有问题吧?“(\\+|-)”这是什么写法,把它去掉就没错了。regex构造传的正规有错时会产生异常的。

论坛徽章:
0
3 [报告]
发表于 2013-08-26 16:30 |只看该作者
回复 2# myworkstation


   感谢回复

(\\+|-)?
其中\\+表示‘+’,因为本身+在正则中是转义字符,所以需要\转换。对于\,对与c也是转意字符,所以要转意两次,c一次,正则引擎一次
‘-’号不用多讲
?是说他俩可有可无

不知道我说的对不?

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
4 [报告]
发表于 2013-08-26 16:49 |只看该作者
回复 3# leewon1988


    这儿应该用四个\,这么写(\\\\+|-)?才可以,要么写成raw string。

论坛徽章:
0
5 [报告]
发表于 2013-08-28 16:42 |只看该作者
回复 4# myworkstation

c++里两个就可以了吧

一个用于编译器
一个和w结合使用,供正则使用


   

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
6 [报告]
发表于 2013-08-28 17:12 |只看该作者
回复 5# leewon1988


    你可以看看这篇文章,有这个问题有详细解释。
http://www.informit.com/articles ... 064649&seqNum=2

论坛徽章:
0
7 [报告]
发表于 2013-08-30 13:35 |只看该作者
回复 6# myworkstation

十分感谢版主不厌其烦的回答我的问题。
我想版主可能理解错了我上面代码的意思了。

我这里并不是想在正则中表示一个'\',我是想表示一个'+',所以使用了'\\+’



   

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
8 [报告]
发表于 2013-08-30 13:42 |只看该作者
回复 7# leewon1988


    我理解你的意思,实际上是这样的,如果要在std::regex中使用+那么就是需要使用四个"\",就是说如果regex实际应该接收"\+"的话,"\"需要两次转义,每次转义由两个"\"组成("\\")。你可以写代码做个测试。

论坛徽章:
0
9 [报告]
发表于 2013-08-30 13:57 |只看该作者
回复 8# myworkstation
  1. #include <boost/regex.hpp>
  2. #include <string>
  3. #include <iostream>

  4. int main(int argc,char* argv[])
  5. {
  6.         boost::regex r("(\\+|-)?123");
  7.         std::string str("+123");
  8.         if(boost::regex_match(str,r))
  9.         {
  10.                 std::cout<<"r"<<std::endl;
  11.         }
  12.         return 0;
  13. }
复制代码
  1. g++ -g -Wall test_boost_regex.cpp -lboost_regex
  2. ./a.out
复制代码
  1. r
复制代码
这是使用boost库的结果

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
10 [报告]
发表于 2013-08-30 14:46 |只看该作者
回复 9# leewon1988


    boost::regex和std::regex并不是完全一致的,在boost::regex下可以不一定在std::regex就可以,boost库的更新频率比std标准库可高的多,标准对正则的具体行为规定的并不很多,很多都是由实现去定义的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP