之前用正则表达式都是用的其他框架的类,比如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
新闻热点
疑难解答
图片精选