常用函数:
regex_match:全文匹配,要求整个字符串符合正则表达式的匹配规则。用来判断一个字符串和一个正则表达式是否模式匹配,如果匹配成功则返回true,否则返回false。
regex_search:搜索匹配,根据正则表达式来搜索字符串中是否存在符合规则的子字符串。
regex_replace:替换匹配,即可以将符合匹配规则的子字符串替换为其他字符串。要求输入一个正则表达式,以及一个用于替换匹配子字符串的格式化字符串。这个格式化字符串可以通过转义序列引用匹配子字符串中的部分内容。
语法规则:
\ 表示将下一字符标记为特殊字符、转义字符;
^ 表示字符串的开始,匹配输入字符串开始的位置;
^$ 表示字符串的结尾,匹配输入字符串结尾的位置;
. 表示匹配除换行符" \n "以外的任意字符;
\w 表示任意字母、数字、下划线 ;
\s 表示任意空白符(tab也包含在内);
\d 表示匹配单个数字字符,\D 表示非数字字符匹配;
[] 表示一个字符集合,匹配指定范围内的任何字符,例如[a-z]表示字母a~z所组成的集合;
[]中使用^来表示集合的补集,匹配不在指定的范围内的任何字符,例如[^1-3]表示除1 2 3以外数字;
[[:alpha:]] 表示任何字母;
[[:alnum:]] 表示任何字母和数字;
regex::icase 表示匹配时忽略大小写;
{n} 表示正好匹配 n 次前面的字符或表达式,例如"hello{6}",匹配字符串中符合第二个l后边有6个o的子字符串;
{n, } 表示至少匹配 n 次前面的字符或表达式;
{n,m} 表示匹配至少 n 次,至多 m 次前面的字符或表达式;
表示零次或多次匹配前面的字符或子表达式,等效于{0, };
表示一次或多次匹配前面的字符或子表达式;
? 表示零次或一次匹配前面的字符或子表达式;
\t \n \r这些平时非常常见,分别表示制表符匹配、换行符匹配、回车符匹配。
相关习题:
【GPLT】L1-058 6翻了
用regex求解的AC代码:
#include <bits/stdc++.h> using namespace std; int main() { string str; getline(cin,str); cout << regex_replace(regex_replace(str,regex("6666666666+"),"27"),regex("6666+"),"9"); return 0; }
【GPLT】L1-059 敲笨钟
用regex求解的AC代码:
#include <bits/stdc++.h> using namespace std; int main() { int N; cin >> N; getchar(); //cin完再使用getline,一定要记得吃回车 while(N--) { string str; getline(cin,str); if(regex_match(str,regex(".*ong,.*ong\\."))) //对字符串进行模式匹配,true为匹配成功 { cout << regex_replace(str,regex("[[:alpha:]]* [[:alpha:]]* [[:alpha:]]*\\."),"qiao ben zhong.") << endl; } else { cout << "Skipped" << endl; } } return 0; }
删除字符串中的子串
题目描述:
输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2。
输入格式:
输入在2行中分别给出不超过80个字符长度的、以回车结束的2个非空字符串,对应S1和S2。
输出格式:
在一行中输出删除字符串S1中出现的所有子串S2后的结果字符串。
输入样例:
Tomcat is a male ccatat
cat
输出样例:
Tom is a male
用regex求解的AC代码:
#include <bits/stdc++.h> using namespace std; int main() { string s1,s2; getline(cin,s1); getline(cin,s2); //题目要求删除字符串s1中的所有子串s2,直接无脑regex啊 while(regex_search(s1,regex(s2))) //若s1中能匹配到s2 { s1 = regex_replace(s1, regex(s2), ""); //将s1中的s2替换成"" } //直到s1不能匹配到s2为止 cout << s1 << endl; return 0; }