Home > programming > g++4.8.4的regex貌似有问题哦

g++4.8.4的regex貌似有问题哦

October 28th, 2015 Leave a comment Go to comments

使用c++11(g++ 4.8.4)的regex的时候发现了一个问题。因为我不了解ECMAScript的表达式规则,所以我选用了std::regex::extended。 但是测试下来发现连"[0-9]{1,3}"这个表达式也无法正常工作。

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

int main(int argc, char*argv[]) {
if( argc < 2 ) {
std::cerr<<"please input text you want"<<std::endl;
return -2;
}
std::string text(argv[1]);
std::regex expression("[0-9]{1,3}", std::regex::extended);
std::smatch m;
if( std::regex_match(text, m, expression )) {
for( auto it = m.begin(); it != m.end(); it ++ ) {
std::cout<<"Match: " << *it << std::endl;
}
} else {
std::cerr<<"not matched"<<std::endl;
}
return 0;
}

上述代码用./a.out 123会得到not matched. 也就是无法匹配。 
开始我一直认为是我的正则表达式弄错了,但是我用grep来验证发现这个表达式是OK的。

roy@DevBox:~/temp$ echo "123" | grep -E "[0-9]{1,3}"
123

当然到此为止还是不能证明g++的regex是错的,可能c++11的regex和grep的语法有些不一样。

于是我用boost来测试上述代码, 发现使用boost::regex以后上述代码(需要修改regex的namespace)build出来的程序是可以正确匹配"123"的。同时我又使用Visual Studio 2015( Community Edition)来测试上述代码,在VC下,自带的std::regex和boost::regex构建出来的程序都可以正常匹配"123"。

 那么看起来g++4.8.4的std::regex应该是有问题的。在linux下面暂时需要使用boost::regex来构建正则表达式相关的东西了。

Categories: programming Tags: , , ,
  1. No comments yet.
  1. No trackbacks yet.