Chinaunix

标题: c++11 g++4.8 regex如何使用? [打印本页]

作者: leewon1988    时间: 2013-08-25 21:50
标题: c++11 g++4.8 regex如何使用?
  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)
复制代码
什么情况啊?
作者: myworkstation    时间: 2013-08-26 09:56
回复 1# leewon1988


    你的正规表达式写的有问题吧?“(\\+|-)”这是什么写法,把它去掉就没错了。regex构造传的正规有错时会产生异常的。
作者: leewon1988    时间: 2013-08-26 16:30
回复 2# myworkstation


   感谢回复

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

不知道我说的对不?


作者: myworkstation    时间: 2013-08-26 16:49
回复 3# leewon1988


    这儿应该用四个\,这么写(\\\\+|-)?才可以,要么写成raw string。
作者: leewon1988    时间: 2013-08-28 16:42
回复 4# myworkstation

c++里两个就可以了吧

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


   
作者: myworkstation    时间: 2013-08-28 17:12
回复 5# leewon1988


    你可以看看这篇文章,有这个问题有详细解释。
http://www.informit.com/articles ... 064649&seqNum=2
作者: leewon1988    时间: 2013-08-30 13:35
回复 6# myworkstation

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

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



   
作者: myworkstation    时间: 2013-08-30 13:42
回复 7# leewon1988


    我理解你的意思,实际上是这样的,如果要在std::regex中使用+那么就是需要使用四个"\",就是说如果regex实际应该接收"\+"的话,"\"需要两次转义,每次转义由两个"\"组成("\\")。你可以写代码做个测试。
作者: leewon1988    时间: 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库的结果
作者: myworkstation    时间: 2013-08-30 14:46
回复 9# leewon1988


    boost::regex和std::regex并不是完全一致的,在boost::regex下可以不一定在std::regex就可以,boost库的更新频率比std标准库可高的多,标准对正则的具体行为规定的并不很多,很多都是由实现去定义的。
作者: leewon1988    时间: 2013-08-30 14:53
回复 10# myworkstation
  1. #include <regex>
  2. #include <string>
  3. #include <iostream>

  4. int main(int argc,char* argv[])
  5. {
  6.         std::regex r("(\\\\+|-)?123");
  7.         //std::regex r1("(\\+|-)?123");
  8.         std::string str("+123");
  9.         if(!std::regex_match(str,r))
  10.         {
  11.                 std::cout<<"r not"<<std::endl;
  12.         }
  13.         /*else if(std::regex_match(str,r1))
  14.         {
  15.                 std::cout<<"r1"<<std::endl;
  16.         }*/
  17.         return 0;
  18. }
  19. g++ -g -Wall -std=c++11 test_std_regex.cpp
  20. ./a.out
  21. 输出:
  22. r not
复制代码

作者: myworkstation    时间: 2013-08-30 15:38
回复 11# leewon1988


    没折了。在VC++上对比了一下。这个应该是g++(libc++)的bug。
作者: 手短的胖女巫    时间: 2019-01-11 01:46
回复 1# leewon1988

兄弟,这是g++4.8的问题,代码没毛病,升级的4.9就好了
作者: 手短的胖女巫    时间: 2019-01-11 01:48
兄弟,这是g++4.8的问题,代码没毛病,升级到g++4.9就好了




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2