c++11 之 正则表达式的学习(regex)
2017-02-15 22:26
183 查看
之前用正则表达式都是用的其他框架的类,比如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
首先是要引入正则对应的头文件 #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
相关文章推荐
- c++11 std::regex 与 boost::regex相比 前者发现不能用"\\xAA"这样的字符在正则表达式中 至少vs2012中是这样
- (搬运工)Boost学习之正则表达式--regex
- RegEx正则表达式学习笔记
- Boost学习之正则表达式--regex
- !!! boost学习之正则表达式--regex
- Java学习笔记-字符串、正则表达式(String,regex)
- C#Regex正则表达式学习笔记
- java正则表达式及java.util.regex包的学习
- 正则表达式学习指南(四)----How a Regex Engine Works Internally
- Boost学习之正则表达式--regex
- Boost学习之正则表达式--regex
- Boost学习之正则表达式--regex
- 正则表达式基础入门学习http://deerchao.net/tutorials/regex/regex.htm
- java正则表达式及java.util.regex包的学习
- 正则表达式(regex)入门、元字符(特殊字符)学习与提高
- java正则表达式及java.util.regex包的学习
- 【05】 Boost库学习笔记之正则表达式(regex)
- C++11 Regex 正则表达式
- Boost学习之正则表达式--regex
- c++11 学习及测试(emplace_back实现方式 数学分布 正则表达式)