正则表达式

仅记录常识。

单字符匹配

1
2
3
4
5
6
7
[abcd]          仅匹配列表中的单个字符
[^abcde] 匹配列表以外的字符单字符
[a-z] 匹配a-z,大写、数字同理
[\w] 匹配小写、大写、数字、下划线,同[A-Za-z0-9_](单个字符)
[\d] 匹配单个数字
[\s\S] \s匹配空白符(空格、tab、换行等);\S匹配非空白符(非换行、空格、制表等);
[.] 任意单字符,除了换行;

多次匹配

1
2
3
4
5
{n}             匹配n次
{n,m} 匹配n到m次
* *前面的字符或者表达式匹配0次或多次
+ +前面的字符或者表达式匹配1次或多次
? ?前面的字符或者表达式匹配0次或1次

例子:

1
2
3
4
5
6
7
8
9
10
string test = "edcbabcdex";

regex pattern("[a-z]{3}"); //edc
regex pattern("[a-z]{1,4}"); //edcb
regex pattern("[a-z]*"); //edcbabcdex,*和+是一致的这里
regex pattern("[a-z]?"); //e

string test1 = "d";
regex pattern("do*"); //能匹配d,因为o可没有
regex pattern("do+"); //不能匹配d,因为o必须有

贪婪匹配与非贪婪匹配

上述使用{1,4}、*、+时,原则上匹配一次或0次就可以,然而它们都按照最长长度进行匹配,这种特性称为贪婪匹配;

有时候我们希望只按最短的匹配长度匹配,只需要在上述符号后加上"?":

1
2
3
4
string test = "edcbabcdex";
regex pattern("[a-z]{1,4}?"); //e
regex pattern("[a-z]*?"); //空,因为*可以匹配0次
regex pattern("[a-z]+?"); //e

组合匹配

即组成子表达式的方式,使用括号将该部分组合起来即可:

1
regex pattern("(ed){1,4}?"); //匹配ed

括号是一个整体,也是一种通配标记,配合通配符、regex函数,能够快速完成匹配与替换:

1
2
3
4
5
6
7
8
9
regex pattern("([a-z]{2})_([0-9]{3})\\.([a-z]+)");
string test = "ab_123.jpg";
smatch match;
if(regex_search(test,match,pattern)){
cout<<match[0]<<endl; //ab_123.jpg
cout<<match[1]<<endl; //ab
cout<<match[2]<<endl; //123
cout<<match[3]<<endl; //jpg
}
替换:

1
2
3
4
regex pattern("([a-z]{2})_([0-9]{3})\\.([a-z]+)");
string test = "ab_123.jpg";
smatch match;
string newstr = regex_replace(test,pattern,"$1_321.$3"); //$1是第一匹配部分,$3是第三匹配,即输出ab_321.jpg

定位符、忽略大小写

1
2
3
4
5
^ 指示开头
$ 指示末尾

//构造时加上icase
regex pattern("(eD)*",regex::icase);

参考链接:

正则表达式 - 语法