CCF认证 201803-3URL映射——36行代码(正则表达式)

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

题目描述

CCF认证 201803-3URL映射题目描述

算法设计

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

  • 表示1个或多个数字,可以用正则表达式([0-9]+)表示
  • 表示1个或多个非/字符,可以用正则表达式([^/]+)表示
  • 表示1个或多个任意字符,可以用正则表达式(.+)表示

可以利用正则表达式将替换为对应的正则表达式字符串。将给定的多条规则按输入顺序存储在vector>rules中。
对于URL地址,按序与多条规则逐一匹配,若能成功匹配,则输出对应的匹配字符元组。具体实现可见代码。

注意点

感谢评论区星辰浩宇的提醒,本题只要求整数参数输出时要把前导零去掉,对于类似于0aaaa这样的字符串来说,是不需要去除前导0的。当然本题的测试数据没有测试到这一点,不过从严谨性上出发,最好还是注意一下。

C++代码

#include
using namespace std;
bool isStringDigit(const string&s){//判断字符串是否为整数字符串
    for(char c:s)
        if(!isdigit(c))
            return false;
    return true;
}
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(""),"([0-9]+)"},{regex(""),"([^/]+)"},{regex(""),"(.+)"}
    };
    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();
                    if(p!=""&&isStringDigit(p))//是整数
                        printf(" %d",stoi(p));//输出转换后的整数,这里自动去除了前导0
                    else
                        printf(" %s",p.c_str());//输出
                }
                puts("");//换行
                goto loop;//匹配成功,直接匹配下一个URL地址
            }
        puts("404");//没有匹配到任何一个规则,输出404
        loop:;
    }
    return 0;
}

你可能感兴趣的:(CCF)