简记:正则表达式
正则表达式
仅记录常识。
单字符匹配
1 | [abcd] 仅匹配列表中的单个字符 |
多次匹配
1 | {n} 匹配n次 |
例子: 1
2
3
4
5
6
7
8
9
10string 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
4string 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
9regex 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 | regex pattern("([a-z]{2})_([0-9]{3})\\.([a-z]+)"); |
定位符、忽略大小写
1 | ^ 指示开头 |
参考链接: