CCF201803-3 URL映射(JAVA)

这道题真的要认真读题,认真读题了之后,还会有坑

  • 数字的位数限制,题目没有给出,如果爆int是不是要当成str去匹配?
    但是这道题的测试样例,连10位都不到...我又想多了~~

简便起见,题目规定规则中 <str> 和 <int> 前面一定是斜杠,后面要么是斜杠,要么是规则的结束(也就是该参数是规则的最后一部分)。

由于这句话没有仔细读,导致-40...

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        String[] line1 = br.readLine().split(" ");
        int n = Integer.parseInt(line1[0]);
        int m = Integer.parseInt(line1[1]);
        Pattern[] gz = new Pattern[n]; 
        String[] gzn = new String[n]; 
        for(int i = 0 ; i < n ; i++) {
            String[] split = br.readLine().split(" ");
            gz[i] = Pattern.compile(regex(split[0]));//初始化正则
            gzn[i] = split[1];
        }
        while(m-->0) {
            String q = br.readLine();
            process(q,gz,gzn,bw);
        }
        bw.flush();
    }
    private static String regex(String s) {
        String[] sa = s.split("/");
        StringBuilder sb = new StringBuilder();
        for(int i = 1 ; i < sa.length;i ++) {
            if(sa[i].charAt(0)=='<') {
                if(sa[i].charAt(1)=='i') {//整数
                    sb.append("/"+"(\\d{1,10})");//整数的位数不是卡分点
                }else if(sa[i].charAt(1)=='s'){//字符串
                    sb.append("/"+"([-a-zA-Z0-9_.]+)");
                }else {//all
                    sb.append("/"+"([-a-zA-Z0-9_./]+)");
                    return sb.toString();
                }
            }else {//必须一模一样
                sb.append("/"+sa[i]);
            }
        }
        if(s.charAt(s.length()-1)=='/')sb.append("/");//此处忘了加if,少了40分
        return sb.toString();
    }
    private static void process(String q, Pattern[] gz, String[] gzn, BufferedWriter bw) throws IOException {
        for(int i = 0; i < gz.length; i++) {
            if(!q.matches(gz[i].pattern())) continue;//不匹配
            Matcher matcher = gz[i].matcher(q);
             if(matcher.find())  {//匹配
                 bw.write(gzn[i]+" ");
                 int n = matcher.groupCount();//括号匹配点个数
                 for(int k = 1; k <= n ; k++) {
                     String res = matcher.group(k);//是数字就转化成整数
                     if(res.matches("\\d+"))  bw.write(Integer.parseInt(res)+" ");
                     else  bw.write(matcher.group(k)+" ");
                 }
                 bw.write("\n");
                 return;
             }
        }
        bw.write(404+"\n");//找不到
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。