CCF201803-3 URL映射(20分)

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


/**
 * Main.注意考虑到边界情况与特殊情况
 * @author : cxc
 **/
public class Main {

  /**
   * 解析规则,将规则转换成正则表达式
   * 匹配规则
   * @param s
   * @param urlrules
   * @param urlrulesname
   */
  public static void IsMatch(String s, String[] urlrules,String[] urlrulesname) {

    for(int i = 0;i<urlrules.length;i++){
      String[] tempr = urlrules[i].split("/");
      String mycomp = "/" + tempr[1] + "/";
      int strnum = 0;
      int intnum = 0;
      int pathflag = 0;
      for(int j= 2;j<tempr.length;j++){
        if(tempr[j].equals("<str>")){
          mycomp += "[a-zA-Z0-9-_.]+/";
          intnum++;
        }
        else if(tempr[j].equals("<int>")){
          mycomp += "[0-9]+/";
          strnum++;
        }
        else if(tempr[j].equals("<path>")){
          mycomp += "[a-zA-Z0-9-_./]+";//需要特殊处理
          pathflag = 1;
        }
        else {
          mycomp += tempr[j];//直接匹配
        }
      }
      Pattern pat = Pattern.compile(mycomp);
      Matcher mymatcher = pat.matcher(s);
      boolean mybool = mymatcher.matches();
      if(mybool){
        String mystr = mymatcher.group(0);
        int sum = intnum + strnum;
        String[] myr = mystr.split("/");
        String myresult = "";
        for (int k = 2; k < myr.length; k++) {
          if (k == myr.length - 1) {
            myresult += myr[k];
          } else {
            if(pathflag == 0) {
              myresult += myr[k] + " ";
            }
            if(pathflag == 1 && sum != 0){
              myresult += myr[k] + " ";
              sum--;
            }
            else {
              myresult += myr[k] + "/";
            }
          }
        }
        System.out.printf("%s %s%n", urlrulesname[i], myresult);
        return;
      }
    }
    System.out.println("404");
  }

  //超时如何处理?循环展开,减少分支语句
  public static void main(String[] args) {
    Scanner myin = new Scanner(System.in,"utf-8");
    int M = myin.nextInt();
    int N = myin.nextInt();
    //规则条数和待处理的URL地址个数
    String[] urlrules = new String[M];//URL映射规则
    String[] urlrulesname = new String[M];//URL映射规则名字
    String[] urladdres = new String[N];//URL映射地址
    for(int i=0;i<M;i++){
      urlrules[i] = myin.next();
      urlrulesname[i] = myin.next();
    }
    for(int i=0;i<N;i++){
      urladdres[i] = myin.next();
    }
    for(int i=0;i<N;i++){
      IsMatch(urladdres[i],urlrules,urlrulesname);//输出N行,若匹配成功则对应规则和匹配参数,否则输出404
    }
  }
}

发布了96 篇原创文章 · 获赞 56 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/JAck_chen0309/article/details/103529527