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
}
}
}
CCF201803-3 URL映射(20分)
猜你喜欢
转载自blog.csdn.net/JAck_chen0309/article/details/103529527
今日推荐
周排行