問題描述
試題編號: | 201803-3 |
試題名稱: | URL映射 |
時間限制: | 1.0s |
內存限制: | 256.0MB |
問題描述: |
問題描述 URL 映射是諸如 Django、Ruby on Rails 等網頁框架 (web frameworks) 的一個重要組件。對於從瀏覽器發來的 HTTP 請求,URL 映射模塊會解析請求中的 URL 地址,並將其分派給相應的處理代碼。現在,請你來實現一個簡單的 URL 映射功能。 輸入格式 輸入第一行是兩個正整數 n 和 m,分別表示 URL 映射的規則條數和待處理的 URL 地址個數,中間用一個空格字符分隔。 輸出格式 輸入共 m 行,第 i 行表示 qi 的匹配結果。如果匹配成功,設匹配了規則 pj ,則輸出對應的 rj。同時,如果規則中有參數,則在同一行內依次輸出匹配後的參數。注意整數參數輸出時要把前導零去掉。相鄰兩項之間用一個空格字符分隔。如果匹配失敗,則輸出 404。 樣例輸入 5 4 樣例輸出 year_archive 2004 樣例說明 對於第 1 個地址 /articles/2004/,無法匹配第 1 條規則,可以匹配第 2 條規則,參數爲 2004。 數據規模和約定 1 ≤ n ≤ 100,1 ≤ m ≤ 100。
|
import java.util.Scanner;
/**
* 想法:把原串裏面的<int> <str> <path> 替換成正則,
* 然後遍歷判斷,如果符合其中一條在進行劃分輸出
*/
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String intString = "[0-9]+";
String strString = "[a-zA-Z0-9-_.]+";
String pathString = "[a-zA-Z0-9-_./]+";
int n = sc.nextInt();
int m = sc.nextInt();
sc.nextLine();
String[][] patten = new String[n][3];
String[] path = new String[n];
for (int i = 0; i < n; i++) {
String str = sc.nextLine();
// i,0爲url名稱
patten[i][0] = str.split(" ")[1];
// i,1 爲 url匹配規則
patten[i][1] = str.split(" ")[0];
// System.out.println(str.indexOf(' '));
// i,2爲原字符串
patten[i][2] = str.substring(0, str.indexOf(' '));
// 將這些字符用正則表達式進行替換
patten[i][1] = patten[i][1].replace("<int>", intString);
patten[i][1] = patten[i][1].replace("<str>", strString);
patten[i][1] = patten[i][1].replace("<path>", pathString);
}
for (int i = 0; i < m; i++) {
path[i] = sc.nextLine();
}
for (int i = 0; i < m; i++) {
boolean ff = false;
for (int j = 0; j < n; j++) {
if (path[i].matches(patten[j][1])) {
ff = true;
// 如果匹配成功,劃分兩條字符串
String[] pat = patten[j][2].split("/");
String[] url = path[i].split("/");
// 判斷路徑是否有兩個'//'在一起,連在一起進行下一次
if (patten[j][2].contains("<path>")) {
boolean flag = false;
for (int k = 0; k < url.length - 1; k++) {
if (path[i].charAt(k) == '/' && path[i].charAt(k) == path[i].charAt(k + 1)) {
flag = true;
break;
}
}
if (flag) {
ff = false;
continue;
}
}
// 輸出名稱
System.out.print(patten[j][0] + " ");
for (int k = 0; k < pat.length; k++) {
// 如果爲int
if (pat[k].equals("<int>")) {
// 去掉前導0
while (url[k].startsWith("0")) {
url[k] = url[k].substring(1);
}
System.out.print(url[k] + " ");
} else if (pat[k].equals("<str>")) {
// 如果爲 str
System.out.print(url[k] + " ");
} else if (pat[k].equals("<path>")) {
for (int z = k; z < url.length; z++) {
if (z == url.length - 1) {
System.out.print(url[z]);
} else {
System.out.print(url[z] + "/");
}
}
break;
}
}
System.out.println();
break;
}
}
if (!ff) {
System.out.println("404");
}
}
// String string = sc.nextLine();
// System.out.println(string.matches("string"));
// System.out.println(string.matches("/articles/[0-9]+/[a-zA-Z-_.]+"));
}
}