欢迎访问我的CCF认证考试题解目录哦 https://blog.csdn.net/richenyunqi/article/details/83385502

题目描述

CCF认证 201803-3URL映射

算法设计

这道题简直是利用正则表达式的经典题目。

  • <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;
}

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-08-13
  • 2021-11-09
  • 2021-11-04
  • 2021-09-05
  • 2021-10-01
猜你喜欢
  • 2021-09-28
  • 2021-09-25
  • 2022-12-23
  • 2021-12-18
  • 2021-09-12
  • 2022-01-03
  • 2022-01-07
相关资源
相似解决方案