欢迎访问我的CCF认证考试题解目录哦 https://blog.csdn.net/richenyunqi/article/details/83385502
题目描述
算法设计
这道题简直是利用正则表达式的经典题目。
-
<int>表示1个或多个数字,可以用正则表达式([0-9]+)表示 -
<str>表示1个或多个非/字符,可以用正则表达式([^/]+)表示 -
<path>表示1个或多个任意字符,可以用正则表达式(.+)表示
可以利用正则表达式将<int>、<str>、<path>替换为对应的正则表达式字符串。将给定的多条规则按输入顺序存储在vector<pair<string,regex>>rules中。
对于URL地址,按序与多条规则逐一匹配,若能成功匹配,则输出对应的匹配字符元组。具体实现可见代码。
C++代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m;
scanf("%d%d%*c",&n,&m);
string p,r;
vector<pair<string,regex>>rules;//存储URL规则,映射为规则名->规则的正则表达式
vector<pair<regex,string>>trans={
{regex("<int>"),"([0-9]+)"},{regex("<str>"),"([^/]+)"},{regex("<path>"),"(.+)"}
};
while(n--){
cin>>p>>r;
for(auto&i:trans)
p=regex_replace(p,i.first,i.second);//将规则转换为对应的正则表达式
rules.push_back({r,regex(p)});//按输入顺序压入rules中
}
smatch result;
while(m--){
cin>>p;
for(auto i:rules)//对每条规则逐一进行匹配
if(regex_match(p,result,i.second)){//匹配成功
printf("%s",i.first.c_str());//输出规则名
for(auto i=1;i<=result.size();++i){//遍历每一个匹配到的元组
p=result.str(i).c_str();
while(p[0]=='0')//去掉前导0
p.erase(0,1);
printf(" %s",p.c_str());//输出
}
puts("");//换行
goto loop;//匹配成功,直接匹配下一个URL地址
}
puts("404");//没有匹配到任何一个规则,输出404
loop:;
}
return 0;
}