这道题真的要认真读题,认真读题了之后,还会有坑
- 数字的位数限制,题目没有给出,如果爆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");//找不到
}
}