c++11 之 正则表达式的学习(regex)

2/22/2017来源:ASP.NET技巧人气:2199

之前用正则表达式都是用的其他框架的类,比如QT的,并没有用过标准库里面的正则表达式,今日偶然得知c++11里面已经添加了对正则表达式的支持,这绝对是一件大好事,如此强大的正则终于可以不依赖于其他的东西就可以用了,故来学习一下如何使用.

首先是要引入正则对应的头文件 #include <regex>

然后就可以声明正则表达式对应的类了

比如 std::regex re ("\\d+?");

这里是说 匹配至少一个数字

用正则的话,我一般是使用三个用途

1.判断某字符串是否符合要求,标准库的用法如下:

std::regex re ("\\d+?"); std::string str = "12q3"; bool ismatch = regex_match(str, re);

这里的ismatch  结果为false;但若是str = "123";,则返回结果为true

也就是 判断是否符合要求,只需要使用 regex_match 这个函数,传字符串和对应的正则规则,然后返回值的结果就是布尔类型,使用非常方便.

2.批量提取符合条件的字符串

比如我的字符串如下,std::string = "d45df544sf";我需要将其中的数字全部提取出来,则代码如下:

std::regex re("\\d+"); std::string str = "d45df544sf"; std::smatch sm; while (regex_search(str, sm, re)) { for (int i = 0; i < sm.size(); ++i) std::cout << sm[i] << " "; std::cout << std:: endl; str = sm.suffix().str(); }

这里使用while循环来重复匹配 达到查找全部符合规则的字符串.

此外 还可以使用迭代器的写法来进行提取 代码如下:

std::regex re("\\d+"); std::string str = "d45df544sf"; for (std::sregex_iterator i = std::sregex_iterator(str.begin(), str.end(), re); i != std::sregex_iterator(); ++i) { std::cout << i->str() << '\n'; }

也能达到相同的结果 都是输出 45    544

3.进行字符串替换

替换使用的函数是regex_replace 用法如下

std::regex re ("\\d+"); std::string str = "12a3"; std::string str2 = regex_replace(str,re,std::string("w"));

这里实现的效果就是将连续的数字全部替换成w  str2的结果为waw

替换的使用方式与判断是否符合规则类似 只是在最后多传一个要替换为的字符串 然后返回替换后的字符串.

总体来说,标准库的正则表达式的使用我认为是非常方便的,能满足日常的基本需求.

关于正则表达式的入门资料,推荐http://deerchao.net/tutorials/regex/regex.htm