正则表达式

元字符

字符描述
\cx匹配由x指明的控制字符
\f匹配一个换页符
\n匹配一个换行符
\r匹配一个回车符
\s匹配任何空白字符,包括空格、制表符、换页符等等。
\S匹配任何非空空白字符
\t匹配一个制表符
\v匹配一个垂直制表符
\转义
\d匹配数字字符,相当于[0-9]
\D匹配非数字字符,等效于[^0-9]
\w匹配任何字母数字和下划线,等效于[a-zA-Z0-9_]
\W匹配任何非字母数字和下划线,等效于[^a-zA-Z0-9_]
\xnn表示数字,和ascii码表对应
\numnum表示数字,表示捕获到的第一个表达式
\n表示反向引用或者八进制数
\un匹配Unicode

特殊字符

$匹配输入字符串的结尾位置
()标记一个子表达式的开始和结束位置
*匹配前面的子表达式零次或多次
+匹配前面的子表达式一次或多次
.匹配除换行符\n之外的任何单字符
[表示一个字符集的开始
?匹配前面的子表达式零次或一次,或指明一个非贪婪限定符
\将下一个字符标记为其本身
^匹配输入字符串的开始位置。除非在[]中使用,此时表示不接受该字符集合
{标记限定符表达式的开始
|指明两项之间的一个选择

限定符

{n}匹配确定的n次
{n,}至少匹配n次
{n,m}n<=m,最少匹配n次且最多匹配m次

*和+都是贪婪的,意思是会尽可能的多匹配,但是在后面加上?就可以使他们变成非贪婪的

非贪婪表示最小匹配。


定位符

字符描述
^匹配输入字符串开始的位置
$匹配字符串的结尾位置
\b匹配一个单词的边界,即字与空格间的位置
\B非单词边界匹配

反向引用

项目描述
(express)匹配并捕获匹配的该字符串,可以使用\n来指定
(?:express)匹配的结果会显示,但是无法通过\num来引用
(?=express)非捕获匹配,匹配的结果不显示。向前查找
(?<=express)非捕获匹配。向后查找
(?<!express)非捕获匹配。负向后查找
(?!express)非捕获匹配。负向前查找

C++ regex

regex_match

regex_match返回一个bool值,表示是否完全匹配。

regex_match可以有2个参数,待匹配字符串、正则表达式

std::string str = "once again";    //待匹配字符串
std::regex expression("[a-z]+\\s[a-z]+");    //正则表达式
bool boolean;                    //返回值true or false
boolean = std::regex_match(str, expression);

regex_match也可以有3个参数,待匹配字符串,需要保存的字符串,正则表达式

std::string str = "once again";
std::regex expression("([a-z]+)\\s([a-z]+)");
std::smatch result;        //存储结果容器
bool boolean;
boolean = std::regex_match(str, result, expression);
for(int i=0;i<result.size();i++)
{
    std::cout << "result[" << i << "] = " << result.str(i) << std::endl;
}

// 结果
// result[0] = once again
// result[1] = once
// result[2] = again

regex_search

regex_search表示搜索匹配,只要待匹配字符串中的子字符串符合正则表达式,则返回true,否则返回false。

与regex_match一样,regex_search也可以有2个参数,3个参数,甚至是4个参数。

2个参数判断子字符串是否符合正则表达式

3个参数可以将第一个符合正则表达式的子字符串保存下来

4个参数可以将所有符合正则表达式的子字符串保存下来

下面只讲4个参数的情况

std::string str = "once again boom";
std::regex expression("[a-z]+");
std::smatch result;
std::string::const_iterator start = str.begin();        //定义两个迭代器
std::string::const_iterator end = str.end();
while(std::regex_search(start, end, result, expression)){
    printf("result = %s\n", result.str().c_str());
    start = result[0].second;                //更新结果的位置
}

regex_replace

regex_replace替换其中符合正则表达式的子字符串

std::string str = "once again";
std::regex expression("([a-z]+)");
std::cout << std::regex_replace(str, expression, "Hello") << std::endl;
//输出:
//Hello Hello

regex_replace调换顺序

std::string str = "once again";
std::regex expression("([a-z]+)(\\s)([a-z]+)");
std::cout << std::regex_replace(str, expression, "$3$2$1") << std::endl;
//输出
//again once

参考

正则表达式-菜鸟教程

https://blog.csdn.net/qq_34802416/article/details/79307102


正则表达式必知必会

基础

1.正则表达式的作用是是信息的搜索和替换

2.不同语言对于正则表达式的底层实现方式有差异

3.正则表达式可以直接使用文本

4.^表示非时,是作用于[ ]中所有的字符,而不仅限于^后面的那个字符

5.匹配十六进制\x,使用八进制\0

6.也可以使用POSIX类类匹配,[:alnum:]、[:alpha:]等

7.?可以使*或者+变成非贪婪型(匹配的越少越好)

8.|表示或,表示两边可以任选一个,但是要注意或的边界,即|表示的并不是左边的一个字符,或者右边的一个字符,而是左边的一群字符,和右边的一群字符

9.子表达式用()来表示,在同一个表达式中可以用\1,\2,\3来表示子表达式的次序。如果在另外一个表达式中需要引用该子表达式的话,需要用$1,$2,$3来表示

10.子表达式的替换操作,替换操作也是一个正则表达式

\l:把下一个字符转为小写

\u:把下一个字符转为大写

\L:把L和E之间的字符全部转为小写

\U:把U和E之间的字符全部转为大写

\E:终结L和U

10.向前查找(?=)的长度是可变的,向后查找的长度是固定的(?<=)

11.嵌入条件查找,(?(1)a|b)表示第一个查找条件知否存在,存在则选择a,不存在则选择b

12.前后查找条件?(?=)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值