正则表达式

本文介绍了正则表达式的作用,如字符串处理、提取特定子串和验证密码等。C++从C11开始支持正则表达式,通过正则表达式对象和相关函数实现。正则表达式的语法包含多种基本单元,如字符范围和重复次数。文中提供代码示例,帮助理解正则表达式的使用,并推荐了学习和测试正则表达式的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作用

主要用于一些字符串的处理,比如说判断字符串是否符合某种条件,取出字符串中符合要求的子串,或者将某一部分替换.比如说从一串文本中提炼出电话号码,或者判断密码是否符合要求,都可以使用正则表达式

正则表达式的语法

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;
}

其他资料

如何看懂复杂的正则表达式
正则表达式相关工具

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值