首页 > 编程语言 >Java URL映射

Java URL映射

时间:2024-07-31 16:57:43浏览次数:18  
标签:regex articles 匹配 映射 URL 斜杠 规则 Java

问题描述

  URL 映射是诸如 Django、Ruby on Rails 等网页框架 (web frameworks) 的一个重要组件。对于从浏览器发来的 HTTP 请求,URL 映射模块会解析请求中的 URL 地址,并将其分派给相应的处理代码。现在,请你来实现一个简单的 URL 映射功能。
  本题中 URL 映射功能的配置由若干条 URL 映射规则组成。当一个请求到达时,URL 映射功能会将请求中的 URL 地址按照配置的先后顺序逐一与这些规则进行匹配。当遇到第一条完全匹配的规则时,匹配成功,得到匹配的规则以及匹配的参数。若不能匹配任何一条规则,则匹配失败。
  本题输入的 URL 地址是以斜杠 / 作为分隔符的路径,保证以斜杠开头。其他合法字符还包括大小写英文字母、阿拉伯数字、减号 -、下划线 _ 和小数点 .。例如,/person/123/ 是一个合法的 URL 地址,而 /person/123? 则不合法(存在不合法的字符问号 ?)。另外,英文字母区分大小写,因此 /case/ 和 /CAse/ 是不同的 URL 地址。
  对于 URL 映射规则,同样是以斜杠开始。除了可以是正常的 URL 地址外,还可以包含参数,有以下 3 种:
  字符串 <str>:用于匹配一段字符串,注意字符串里不能包含斜杠。例如,abcde0123。
  整数 <int>:用于匹配一个不带符号的整数,全部由阿拉伯数字组成。例如,01234。
  路径 <path>:用于匹配一段字符串,字符串可以包含斜杠。例如,abcd/0123/。
  以上 3 种参数都必须匹配非空的字符串。简便起见,题目规定规则中 <str> 和 <int> 前面一定是斜杠,后面要么是斜杠,要么是规则的结束(也就是该参数是规则的最后一部分)。而 <path> 的前面一定是斜杠,后面一定是规则的结束。无论是 URL 地址还是规则,都不会出现连续的斜杠。

输入格式

  输入第一行是两个正整数 n 和 m,分别表示 URL 映射的规则条数和待处理的 URL 地址个数,中间用一个空格字符分隔。
  第 2 行至第 n+1 行按匹配的先后顺序描述 URL 映射规则的配置信息。第 i+1 行包含两个字符串 pi 和 ri,其中 pi 表示 URL 匹配的规则,ri 表示这条 URL 匹配的名字。两个字符串都非空,且不包含空格字符,两者中间用一个空格字符分隔。
  第 n+2 行至第 n+m+1 行描述待处理的 URL 地址。第 n+1+i 行包含一个字符串 qi,表示待处理的 URL 地址,字符串中不包含空格字符。

输出格式

  输入共 m 行,第 i 行表示 qi 的匹配结果。如果匹配成功,设匹配了规则 pj ,则输出对应的 rj。同时,如果规则中有参数,则在同一行内依次输出匹配后的参数。注意整数参数输出时要把前导零去掉。相邻两项之间用一个空格字符分隔。如果匹配失败,则输出 404。

样例输入

5 4
/articles/2003/ special_case_2003
/articles/<int>/ year_archive
/articles/<int>/<int>/ month_archive
/articles/<int>/<int>/<str>/ article_detail
/static/<path> static_serve
/articles/2004/
/articles/1985/09/aloha/
/articles/hello/
/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 个字符(不包含换行符)。
  保证输入的规则都是合法的。


import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int rule_count = scanner.nextInt();
        int url_count = scanner.nextInt();
        scanner.nextLine();
        Map<String, String> map = new LinkedHashMap<>();
        for (int i = 0; i < rule_count; i++) {
            String rule = scanner.nextLine();
            String[] arr = rule.split(" ");
            String regex = arr[0];
            regex = regex.replace("<int>", "([0-9]+)");
            regex = regex.replace("<str>", "([^/]+)");
            regex = regex.replace("<path>", "(.+)");
            map.put(arr[1], regex);
        }
        for (int i = 0; i < url_count; i++) {
            String line = scanner.nextLine();
            boolean bFind = false;
            for (Map.Entry<String, String> entry : map.entrySet()) {
                Pattern pattern = Pattern.compile(entry.getValue());
                Matcher matcher = pattern.matcher(line);
                if (matcher.matches()) {
                    bFind = true;
                    System.out.println(entry.getKey()+" ");
                    for (int j = 0; i <= matcher.groupCount(); j++) {
                        String tmp=matcher.group(j);
                        if (tmp.matches("[0-9]+")){
                            System.out.println(Integer.parseInt(tmp)+" ");
                        }
                        else {
                            System.out.print(tmp+" ");
                        }
                    }
                    break;
                }

            }
            if (!bFind) {
                System.out.println("404");
            }
            System.out.println();

        }
    }
}

(编译未通过,正在修改中。。。。)

标签:regex,articles,匹配,映射,URL,斜杠,规则,Java
From: https://blog.csdn.net/qq_62658919/article/details/140791347

相关文章

  • Java的杂七杂八(未完成)
    java特点1、面向对象性:两大要素:类、对象三大特征:封装、继承、多态2、健壮性:去除了c/c++的指针;添加了垃圾回收机制--->但Java依旧可能出现内存的溢出和泄漏3、跨平台性:writeonce,runanywhere“一次编译,到处运行”-->JVM不同的操作系统需要安装不同的JV......
  • Java 方法
    方法一、语句定义格式修饰符返回值类型方法名(参数类型1参数名1,参数类型2参数名2,...){方法的实现逻辑;return返回值;}名词解释修饰符:目前的固定写法publicstatic2hgwaghgwdh7yygxsafe方法名:将来调用者使用功能的名字,可以通过名字调用,方法名要符合标识符的命名规......
  • Java面向对象
    Java面向对象(OOP)学习面向对象的三条主线1、Java中类及类的成员2、面向对象的三大特征3、其他关键字的使用Java中类及类的成员1、成员变量(或属性)2、方法(函数)3、构造器(或构造方法)4、代码块(或初始化块)5、内部类面向对象的三大特征封装性、继承性、多态性(+抽象性)其他关......
  • 计算机Java项目|基于SpringBoot的科研工作量管理系统
    作者简介:Java领域优质创作者、CSDN博客专家、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参与学生毕业答辩指导,有较为丰富的相关经验。期待与各位高校教师、企业......
  • java中队列queue操作
    文章目录前景描述方法描述结语前景描述java中的queue(队列)是比较常见的数据结构,它继承于collection(集合),但相对collection,queue提供了一些独有的功能,为特定场景下操作元素提供了便利。queue在java中的顶级接口是Queue,该接口定义了queue的基本操作一共有六个add,offer......
  • 【转型必看】Java到AI,程序员的逆袭秘籍,转行人工智能不再是梦!
    ​随着技术的不断进步,人工智能(AI)已经成为当今科技领域最热门的话题之一。许多开发者开始考虑从传统的软件开发领域,如Java,转向人工智能领域,今天小编和大家一起来探讨Java开发者是否可以转型到人工智能,转型的优势,薪资对比,以及转型所需的知识和学习路线等。01 Java开发者能否转型......
  • 简述JavaFX-Web
    Maven版本22.x<!--https://mvnrepository.com/artifact/org.openjfx/javafx-web--><dependency><groupId>org.openjfx</groupId><artifactId>javafx-web</artifactId><version>22.0.2</version></depe......
  • Java泛型的高级应用
    引言Java泛型是Java5引入的一项强大特性,它允许开发者在编写代码时指定类型参数,从而提高代码的复用性和安全性。尽管泛型在表面上看起来简单,但它的工作原理和高级应用却涉及许多复杂的主题,如类型擦除、类型推断、以及泛型在集合和自定义类中的应用。本文将深入探讨这些高......
  • 注解(Annotation)在Java开发中的应用
    注解(Annotation)在Java开发中的应用引言注解(Annotation)是Java语言的一个特性,用于为代码提供元数据。注解可以被编译器或运行时环境用来处理代码,例如编译时检查、运行时处理等。Spring框架广泛使用了注解来简化配置和提高开发效率。本文将讲解注解的基本概念、如何自定义注......
  • 学习Java的日子 Day60 JSP
    JSP核心技术1.什么是JSPJSP和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。JSP实际上就是ServletJSP这门技术的最大的特点在于,写jsp就像在写html,但它相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据......