正则表达式概念
正则是指一种规则,用来匹配,捕获,替换字符串(字符串的处理方案)
正则组成
特殊含义元字符
1.^ ,以字符作为字符串开的头,^表示单个字符
2.$:以字符结尾,表示单个字符()
3.():分组
4.\b:字符串的边界
5…:除了\n以外的任意一个字符
6. | :或者的意思, a | b,表示 a或者b
7.[] :一般情况表示字符串的范围,[abc]表示abc任意一个字符
注意 ^通常与[],搭配使用,表示相反的,
例如: [ ^abc] 表示 除abc以外的任意一个字符
[a-z] :表示任意一个小写字母
8. \w 任意数字字母下划线
9.\W:数字字母下划线以外的任意字符 (与\w的作用相反)
10.\d:任意一个数字
11.\D:数字以外的任意一个字符(作用与\d相反)
12.\s:空白符(空格)
量词元字符
1.* 0次或者多次 [a-z]* 表示:多个小写字母或者没有小写字母
2.+:一次或者多次
3.(n) : 出现n次
4.{n, }:至少出现n次
5.{n, m}:至少有n到m个字符
注意:** 在C/C++中 带单\的元字符都要改为双\**
正则表达式的使用
正则库也是C++11新标准以后出现的
有3个功能
1.做匹配
2.做截取
3.做查找
注意要包含头文件 regex
匹配
第一步:先构建正则对象
第二步:用regex_match()函数,进行正则对象的匹配
如果匹配成功,返回true,如果匹配不成功,返回false
#include<string> #include<iostream> #include<regex> using namespace std; int main() { //可用来设置密码 regex reg("^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$"); //构造正则对象 //例如密码的强度为:包含大小写字母和数字的组合, //不能使用特殊字符,长度在8 - 10之间。 string code; cin >> code; bool ret = regex_match(code, reg); //用regex_match(),做匹配 if (ret) { cout << "匹配成功" << endl; } else { cout << "匹配不成功" << endl; } return 0; }
注意:正则匹配一定是完全匹配
regex 也有第二个参数,
比如说: regex_constants::icase
忽略字母大小写
截取
要使用 regex_search()函数
regex_search(string str, smatch result, regex reg)
其中,匹配的字符串的前缀和后缀,都存在result中的prefix和suffix函数中
匹配的结果在result的str函数中
这个函数的返回值,同样也是bool类型
#include<iostream> #include<regex> #include<string> using namespace std; int main() { string str = "jibub1314ojojo"; smatch result; //注意:这里regex构造的是无名对象 bool ret = regex_search(str, result, regex("\\d+")); //匹配的规则,多个数字 if (ret) { cout << " 匹配成功" << endl; cout << result.size() << endl; for (int i = 0; i < result.size(); i++) { cout << result.str() << endl; } cout << result.prefix() << endl; //前缀 cout << result.suffix() << endl; //后缀 } else { cout << "false" << endl; } return 0; }
这个regex_search() 找到满足 的一个就结束
如果想捕获所有满足条件的字符串
就用sregex_iterator
#include<iostream> #include<regex> #include<string> using namespace std; int main() { string str = "dbjauh90989kj 8989ji"; regex reg("\\d+"); //得到所有满足满足条件的匹配结果 sregex_iterator pos(str.begin(), str.end(), reg); sregex_iterator end; //无参构造是结束流 while (pos != end) { cout << pos->str() << "\t"; pos++; } cout << endl; return 0; }
当然,如果你想得到不匹配的
可一使用sregex_token_iterator tpos(str.begin(), str.end(), reg2,-1); 函数
最后一个参数为-1时,得到不匹配的结果,最后一个参数为0时,得到匹配的结果
替换
替换可以用regex_replace()函数
当然可以用来解决一些去重问题
其中有的一些控制替换,
regex_constants 可以去查查帮助手册
#include<iostream> #include<string> #include<regex> using namespace std; int main() { string str = "ILoveyou******IMiss*******y*****o***u"; regex reg("\\*+"); //regex_replace(string str,regex regx,string content) //返回值是处理后的字符串 cout << "888:" << regex_replace(str, reg, "*") << endl; //控制替换 cout << "only one:" << regex_replace(str, reg, "*", regex_constants::format_first_only) << endl; cout << "no copy:" << regex_replace(str, reg, "*", regex_constants::format_no_copy) << endl; cout << "sed:" << regex_replace(str, reg, "*", regex_constants::format_sed) << endl; return 0; }