正则表达式

字符组 []

[Pp]ython 就可以匹配到Python python 也就是开头是P或者p 后面接ython的字符串
[0-9]就是可以匹配到0-9之间的所有数字 但是只匹配一个
[0-9a-zA-Z]就是匹配所有的数字 小写字母 大写字母 只匹配一个

[a-zA-Z0-9]+ (表示英文包括大小写数字全匹配)

^

中括号中的^表示非
[^0-9]表示不会匹配0-9
直接写的^表示精确查询
^ab$表示必须以ab结尾
[^0-9]+ 或者[^0-9]*用来匹配换行符

汉字

[\u4e00-\u9fa5]表示汉字范围在这个范围内的汉字 这是utf-8编码
regex_match(s,regex("[\ue400-\u9fa5]+"));//可以匹配"你好"

+

表示一个或多个
[\d]+ 就可以匹配143252 只有[\d]就只能匹配其中一个数字

*

表示匹配0个或多个

. 可以匹配任何东西 除了\n

.*一般用来匹配一堆东西
a.*b将会匹配最长的以a开始,以b结束的字符串
[/-]通过转译字符匹配‘-’ 等特殊字符

想匹配多个特殊字符时
例如[\[|\]|\-|\(|\)]匹配-----()[] 通过|来进行分割
也可以表示 或
([abcd|1234])表示可以匹配abcd或者1234

$

$ 表示结尾 ab$ 表示必须以ab结尾
python$表示在结尾处匹配python 并且不能加特殊符号包括空格

下面这些小写字母换成大写字母就是非的意思
[\d]表示全部数字 [\D]表示不匹配数字
[\w]表示数字 大小写字母都可以被匹配 但是只匹配一个
[\s]表示匹配空格
[\bwoaini\b] 表示单词边界 只会匹配单词和空格之间的 也就匹配这个单词woaini 如果跟了其他字母数字就不行了 特殊符号可以

在这里插入图片描述

不加[] 直接写^python表示匹配字符串开头的 python 后面如果又出现了python就不会再匹配了 比如 python123python他就只能匹配到前面那段python
在这里插入图片描述

?

?n表示这个n可以出现也可以不出现

{}

{3}表示重复次数3
比如\d{3}-\d{5}
在这里插入图片描述
{3,4}表示可以匹配3个也可以匹配4个 如果是{3,}表示匹配3个以上的数字
例如
在这里插入图片描述
+等价于{1,}
*等价于{0,}

<>

<.+> (默认贪婪匹配任意字符)
<.+?> (默认懒惰匹配任意字符)

提取

(\d{4})-(\d{7})这样就可以提取相应的数据了

regex_match 全文匹配

match是全文匹配,即要求整个字符串符合匹配规则。

cout << regex_match("123", regex("\\d")) << endl;		//结果为0. \\是为了转义 \

cout << regex_match("123", regex("\\d+")) << endl;		//结果为1

regex_search 搜索匹配

regex_search(匹配字符串,获取结果,匹配规则)
regex_search(起始位置,终止位置,获取结果,匹配规则)// 起始位置和终止位置是目标字符串的迭代器
字符串中存在符合规则的子字符串

string str = "Hello 2018, Bye 2017";
smatch result;
regex pattern("\\d{4}");	//匹配四个数字

//迭代器声明
string::const_iterator iterStart = str.begin();
string::const_iterator iterEnd = str.end();
string temp;
while (regex_search(iterStart, iterEnd, result, pattern))
{
	temp = result[0];
	cout << temp << " ";
	iterStart = result[0].second;	//更新搜索起始位置,搜索剩下的字符串
}

//输出结果:2018 2017

cmatch 存储结果

string str = "Hello_2018";
smatch result;
regex pattern("(.{5})_(\\d{4})");	//匹配5个任意单字符 + 下划线 + 4个数字
//主要是通过()决定是第几组
if (regex_match(str, result, pattern))
{
	cout << result[0] << endl;		//完整匹配结果,Hello_2018
	cout << result[1] << endl;		//第一组匹配的数据,Hello
	cout << result[2] << endl;		//第二组匹配的数据,2018


	cout<< result.str() << endl;	//完整结果,Hello_2018
	cout<< result.str(1) << endl;	//第一组匹配的数据,Hello
	cout << result.str(2) << endl;	//第二组匹配的数据,2018
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值