欢迎访问我的CCF认证解题目录
题目描述
思路过程
这道题是一个规则匹配的问题,我们可以把规则中的<xx>替换成正则表达式进行匹配。
不会正则表达式的可以看我另一篇博客:https://blog.csdn.net/weixin_43732798/article/details/100081039
- <int>用"([0-9]+)"表示
- <str>用"([^/]+)"表示
- <path>用"(.+)"表示
定义一个类存储规则和对应的值(为什么不用map?,看到后面就知道了),对于每个url地址,逐一进行匹配。
注意对于整数参数要去除前导零,匹配成功后,我们可以在字符串对应位置加上一个a,如果加上后不能进行匹配,说明是<int>,要取出前导零。
代码
import java.util.ArrayList;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
ArrayList<Regex> regex = new ArrayList<Regex>(); //存储规则
for ( int i = 0; i < n; i++ ) { //转化规则为正则表达式
regex.add( new Regex(in.next(),in.next()) );
regex.get(i).r = regex.get(i).r.replaceAll("<int>", "([0-9]+)");
regex.get(i).r = regex.get(i).r.replaceAll("<str>", "([^/]+)");
regex.get(i).r = regex.get(i).r.replaceAll("<path>", "(.+)");
}
for ( int i = 0; i < m; i++ ) {//m个url
String url = in.next(); //地址
Boolean flag = false; //匹配标志
for ( int j = 0; j < n; j++ ) {//遍历规则
Pattern value = Pattern.compile(regex.get(j).r);
Matcher matcher = value.matcher(url);
if ( matcher.matches() ) { //匹配成功
System.out.print(regex.get(j).value);
for ( int k = 1; k <= matcher.groupCount(); k++ ) {//遍历捕获组
String str = matcher.group(k);
String t = url.replaceAll(str, str+"a");//如果加上a就不能匹配,说明不是<int>
if ( !t.matches(regex.get(j).r) ) {//如果是数字
System.out.print(" "+Integer.parseInt(str));
} else System.out.print(" "+str);
}
System.out.println();
flag = true;
break;
}
}
if (!flag) System.out.println("404");//不能匹配
}
}
}
class Regex {
String r; //规则
String value; //对应的值
public Regex(String r, String value) {
this.r = r;
this.value = value;
}
}
为什么不使用map?这我也很懵逼,使用map遍历规则的时候好像会发生神秘错误,只能得80分,思路是一样的。有哪位路过的大佬帮我看看⊙﹏⊙∥
代码如下
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
ArrayList<Regex> regex = new ArrayList<Regex>(); //存储规则
HashMap<String, String> map = new HashMap<String, String>();//map遍历
for ( int i = 0; i < n; i++ ) { //转化规则为正则表达式
regex.add( new Regex(in.next(),in.next()) );
regex.get(i).r = regex.get(i).r.replaceAll("<int>", "([0-9]+)");
regex.get(i).r = regex.get(i).r.replaceAll("<str>", "([^/]+)");
regex.get(i).r = regex.get(i).r.replaceAll("<path>", "(.+)");
}
for ( int i = 0; i < regex.size(); i++ ) {//直接抄过来
map.put(regex.get(i).r, regex.get(i).value);
}
for ( int i = 0; i < m; i++ )
{//m个url
String url = in.next(); //地址
Boolean flag = false; //匹配标志
for (String r : map.keySet() ) //改成map遍历规则,就改动了1、2、3个地方
// for ( int j = 0; j < n; j++ )
{//遍历规则
Pattern value = Pattern.compile(r);//1
Matcher matcher = value.matcher(url);
if ( matcher.matches() ) { //匹配成功
System.out.print(map.get(r));//2
for ( int k = 1; k <= matcher.groupCount(); k++ ) {//遍历捕获组
String str = matcher.group(k);
String t = url.replaceAll(str, str+"a");//如果加上a就不能匹配,说明不是<int>
if ( !t.matches(r) ) {//如果是数字---3
System.out.print(" "+Integer.parseInt(str));
} else System.out.print(" "+str);
}
System.out.println();
flag = true;
break;
}
}
if (!flag) System.out.println("404");
}
}
}
class Regex {
String r; //规则
String value; //对应的值
public Regex(String r, String value) {
this.r = r;
this.value = value;
}
}