Chinaunix
标题:
c++11 g++4.8 regex如何使用?
[打印本页]
作者:
leewon1988
时间:
2013-08-25 21:50
标题:
c++11 g++4.8 regex如何使用?
#include <regex>
#include <iostream>
#include <string>
using namespace std;
int main(int argc,char* argv[])
{
string str;
regex reg("(\\+|-)?[[:digit:]]+",regex_constants::extended);
cin>>str;
while(str!="q")
{
if(regex_match(str,reg))
{
cout<<"Num:"<<str<<endl;
}
else
{
cout<<"Not num: "<<str<<endl;
}
cin>>str;
}
return 0;
}
复制代码
编译没问题:
g++ -g -Wall -std=c++11 test_regex.cpp
运行错误:
./a.out
terminate called after throwing an instance of 'std::regex_error'
what(): regex_error
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
#include <boost/regex.hpp>
#include <string>
#include <iostream>
int main(int argc,char* argv[])
{
boost::regex r("(\\+|-)?123");
std::string str("+123");
if(boost::regex_match(str,r))
{
std::cout<<"r"<<std::endl;
}
return 0;
}
复制代码
g++ -g -Wall test_boost_regex.cpp -lboost_regex
./a.out
复制代码
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
#include <regex>
#include <string>
#include <iostream>
int main(int argc,char* argv[])
{
std::regex r("(\\\\+|-)?123");
//std::regex r1("(\\+|-)?123");
std::string str("+123");
if(!std::regex_match(str,r))
{
std::cout<<"r not"<<std::endl;
}
/*else if(std::regex_match(str,r1))
{
std::cout<<"r1"<<std::endl;
}*/
return 0;
}
g++ -g -Wall -std=c++11 test_std_regex.cpp
./a.out
输出:
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