URLマッピングCCF(Java正規表現ソリューション)

問題の説明

質問番号: 201803から3
質問名: URLマッピング
制限時間: 1.0秒
メモリの制限: 256.0メガバイト
問題の説明:
問題の説明
  URLマッピングは、ジャンゴ、Ruby on Railsの及び他のWebフレームワーク(Webフレームワーク)などの主要成分です。HTTPリクエストにブラウザから送信された、URLマッピングモジュールは、URL要求を解決し、対応する処理コードにディスパッチ。さて、あなたは、単純なURLマッピング機能を実現するために来ます。
  この問題ではURLマッピング規則のいくつかの部分でURLマッピングを構成しました。要求が到着すると、URLアドレスURLマッピング機能のルールが設定と一致した順に一つずつを要求します。最初のルール完全一致に直面したとき、マッチが成功し、ルールと一致するパラメータが一致し得ます。あなたはこれらのルールのいずれかに一致することができない場合は、マッチは失敗します。
  タイトルURLアドレスは、それがスラッシュから始まる確保するためのパスのセパレータとして/スラッシュを入力します。他の文字も法的小文字、数字、マイナス記号含まれています- 、アンダースコア_と小数点を.. 例えば、/人/ 123 /正当なURLアドレスである、および/人/ 123?(法的文字疑問符がない?)合法的ではありません。さらに、文字は敏感なので、/ケース/と/ケース/異なるURLアドレスを小文字。
  URLマッピングルールについて、同じことがスラッシュを始めています。通常のURLアドレスAに加えて、さらにパラメータを含むことができ、以下の3つがあります:
  文字列<STR>:文字列はスラッシュの注目を含めることはできません文字列を一致させます。例えば、abcde0123。
  整数<整数>:符号なし整数のために一致する、すべてのアラビア数字。たとえば、01234。
  パス<パス>:文字列に一致するように、文字列はスラッシュを含めることができます。たとえば、ABCD / 0123 /。
  パラメータの三種類以上の非空の文字列と一致する必要があります。簡潔、タイトルのルール<STR>と<整数>フロントスラッシュスラッシュのいずれかの後ろに、またはルールの端部(すなわち、パラメータは、ルールの最後の部分である)でなければなりません。フロント<パス>に終了しなければならないルールが続くスラッシュでなければなりません。かどうかの連続したスラッシュが表示されませんURLアドレスルール。
入力形式
  最初の入力ラインは2つの正の整数であり  、N  および  Mは 、それぞれ空白文字で区切られたURLの数とURLアドレスマッピング処理されるルールの数を表します。
  する行の第二  は、n- 構成プロファイルURLマッピング規則に記載された順序を照合することによって+ +1行。  Iは、 行が2列備え+1した  P I  と  R&LT I た、  P Iは、  URLにマッチするルールを表し、 R&LT Iの  名前に一致する、このURLを表しています。二つの非空の文字列は、空白文字、中間の空白文字で区切ら両方が含まれていません。
  第一  のN- へ+2行  N- + M + +1行が処理されるURLアドレスが記載されています。の  N- +1+ 私は  、文字列からなるライン  Qを私は 処理されるURLアドレスを示す、文字列が空白文字が含まれていません。
出力フォーマット
  コモン入力  のm  行は、  i個の  ラインを示し  Q I  マッチング結果を。マッチが成功した場合、一致するルールセット  P J  、対応の出力  R&LT Jを 一方、ルールパラメータ、同じ行のマッチングシーケンスの出力パラメータがある場合。ノートは、先行ゼロ整数パラメータ出力を削除しなければなりません。隣接する二つの間の空白文字で区切られています。マッチが失敗した場合は、出力404。
サンプル入力
5 4
/記事/ 2003 / special_case_2003
/記事/ <整数> / year_archive
/記事/ <整数> / <整数> / month_archive
/記事/ <整数> / <整数> / <STR> / article_detail
/静的/ <パス> static_serve
/記事/ 2004 /
/記事/ 1985年から1909年/アロハ/
/記事/ハロー/
/static/js/jquery.js
サンプル出力
year_archive 2004
article_detail 1985 9 aloha
404
static_serve js/jquery.js
样例说明
  对于第 1 个地址 /articles/2004/,无法匹配第 1 条规则,可以匹配第 2 条规则,参数为 2004。
  对于第 2 个地址 /articles/1985/09/aloha/,只能匹配第 4 条规则,参数依次为 1985、9(已经去掉前导零)和 aloha。
  对于第 3 个地址 /articles/hello/,无法匹配任何一条规则。
  对于第 4 个地址 /static/js/jquery.js,可以匹配最后一条规则,参数为 js/jquery.js。
数据规模和约定
  1 ≤  n ≤ 100,1 ≤  m ≤ 100。
  所有输入行的长度不超过 100 个字符(不包含换行符)。
  保证输入的规则都是合法的。

 

把字符串的前导0也去掉了,80分。。。

 1 import java.util.LinkedHashMap;
 2 import java.util.Map;
 3 import java.util.Scanner;
 4 import java.util.regex.Matcher;
 5 import java.util.regex.Pattern;
 6 
 7 
 8 public class Main {
 9 
10     public static void main(String[] args) {
11         int n, m;
12         int flag = 0;
13         Scanner sc = new Scanner(System.in);
14         n = sc.nextInt();
15         m = sc.nextInt();
16         sc.nextLine();
17         LinkedHashMap<String, String> mp = new LinkedHashMap<>();
18         for (int i = 1; i <= n; ++i) {
19             String line = sc.nextLine();
20             String[] arr = line.split(" ");
21             mp.put(arr[0], arr[1]);
22         }
23 
24         for (int i = 1; i <= m; ++i) {
25             String line = sc.nextLine();
26             for (Map.Entry<String, String> en : mp.entrySet()) {
27                 String regex = en.getKey();
28                 regex = regex.replace("<int>", "(\\d+)");
29                 regex = regex.replace("<str>", "(.+)");
30                 regex = regex.replace("<path>", "(.+)");
31                 if(line.matches(regex)) {    // 完全匹配
32                     flag = 1;
33                     Pattern p = Pattern.compile(regex);
34                     Matcher mat = p.matcher(line);
35                     while (mat.find()) {    
36                         System.out.print(en.getValue());
37                         for (int j = 1; j <= mat.groupCount(); ++j) {
38                             String str = mat.group(j);
39                     //        if(str.matches("\\d+"))
40                             str = str.replaceAll("^0+", "");    // 去掉数字前面的0 (字符串前面的0也去掉了)
41                             System.out.print(" " + str);
42                         }
43                         System.out.println();
44                     }
45                     break;
46                 }
47             }
48             if(flag == 0)
49                 System.out.println(404);
50             else
51                 flag = 0;    // 重置flag
52         }
53 
54     }
55 
56 }

 

おすすめ

転載: www.cnblogs.com/FengZeng666/p/11484278.html