元字符
字符 | 描述 |
\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_] |
\xn | n表示数字,和ascii码表对应 |
\num | num表示数字,表示捕获到的第一个表达式 |
\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.前后查找条件?(?=)