作用
主要用于一些字符串的处理,比如说判断字符串是否符合某种条件,取出字符串中符合要求的子串,或者将某一部分替换.比如说从一串文本中提炼出电话号码,或者判断密码是否符合要求,都可以使用正则表达式
正则表达式的语法
C++的正则表达式
C11提供了正则表达式的支持,使用正则表达式,需要用到正则表达式对象和一些函数,比较重要的对象和函数如下
regex 构造使用字符串作为参数(里面写正则表达式),使用的时候需要加上头文件<regex>
宽字节版本 wregex
比较重要的几个函数
1. regex_match 比较字符串
2. regex_search 查询比较的字符串
3. regex_replace 替换字符串
如果要使用C++的正则表达式,需要创建正则表达式对象,写上规则
正则表达式的语法规则
正则表达式由下面的基本单元组成,示例如下
. 匹配除了'\n'之外的任意单个字符
^ 匹配字符串的开始位置,不匹配任何字符
$ 匹配字符串的结束位置,不匹配任何字符
* 零次或者多次匹配前面的字符/子表达式
a*b 可以匹配 b ab aaab
+ 一次或者多次匹配前面的字符/子表达式
a+b 可以匹配ab aaab
? 零次或者一次匹配前面的字符/子表达式
a?b 可以匹配b或者ab
如果?放到其他的限定符后面,表示搜索尽可能短的字符串
待搜索字符串"ooooo" o+ 匹配到 ooooo
o+? 匹配到 o
| 将两个条件进行或运算
x|y 匹配x或者y
\ 在正则表达式中用于转义,比如\\ 表示\ \? 表示?
\w 匹配字母/数字/下划线
\W 匹配任意不是字母数字下划线的字符
\s 匹配任意空白符(空格,制表符,换页)
\S 匹配任意不是空白符的字符
\d 匹配数字 0~9中任意一个
\D 匹配任意非数字
\b 匹配字边界,不匹配任意字符 ve\b 匹配love但是不匹配never
\B 非字边界匹配 ve\B 匹配nerver但是不匹配love
\f 换页符号
\n 换行符号
\r 回车
\t 制表符
\v 垂直制表符
\cX X属于a~z或者A~Z 表示ctrl+X
\cM 表示ctrl+M
{n} n是非负整数 表示正好匹配n次 o{2} 匹配food中两个n
{n,} n是非负整数 表示至少出现n次 o{2,} 匹配foood
{m,n} m和n都是非负整数,并且m<=n 表示这个字符出现m~n次 比如o{1,2}
[多个字符/范围] 表示这些字符中的一个
[124] 表示1,2,4中的一个
[1-4] 表示1,2,3,4中的一个
[^124] 表示不是1,2,4的任意字符
[^a-z] 表示不在a-z范围内的任意字符
(组) 最多可以有9个 使用\1到\9来引用
(?:内容) test(?:x|y) 相当于匹配 testx或者testy
(?=内容) test(?=x|y) 相当于匹配test(test后面是x或者y)
(?!内容) test(?!x|y) 相当于匹配test(test后面不为x或者y)
以上部分可以搭配,比如说[0-9]{1,2}可以表示两位数字(出现0~9中的一个,出现两次)
因为是字符串的操作,所以这里没有强调字符串,也没有加上双引号,不要误解成整数这种
代码示例
/*
使用示例 判断密码是否符合要求
注册账号时,会要求设置密码,密码不得低于8位,首字母必须大写字母,其余的可以是大小写字母,数字或者特殊符号(比如.,*)
现在输入一个密码,判断是否符合需求
*/
#include<regex>//正则表达式头文件
#include<iostream>
using namespace std;
int main()
{
//密码输入部分暂时略过,直接用示例字符串
char text[20] = "Admin123456";
regex rules("^[A-Z][A-Za-z0-9.,*]{9,}");//创建正则表达式对象
/*
首字母必须是大写,也就是需要规定首字母 用到^
大写字母也就是[A-Z]
其余位置可以是大小写字母,数字或者其他符号中的一个,所以是[A-Za-z0-9.,*]
要求位数不低于8位,那么也就是首位后面至少有7位 在[A-Za-z0-9.,*]后面使用{7,}
*/
if (regex_match(text, rules)) //这里是匹配 所以要用到regex_match
{
cout << "密码符合要求" << endl;
}
else
{
cout << "密码不符合要求" << endl;
}
//如果直接写,也可以if(regex_match(text,regex("^[A-Z][A-Za-z0-9.,*]{9,}"))
cin.get();
return 0;
}