有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java正则表达式:检查传入uri是否存在于列表中

我试图编写一个正则表达式来检查传入的url路径是否与我的列表元素匹配。我怎么写呢?。我试图使用String.contains(/api/v1/read),但它返回false,即使它出现在列表中

my path : /api/v1/read

List<String> pathList = {"/api/v1/**,/api/v2/**"};

任何帮助都将不胜感激


共 (2) 个答案

  1. # 1 楼答案

    如果您需要支持的唯一通配符是一个以/**结尾的路径,那么您可以按如下方式操作:

    1. 将任何逗号分隔的字符串拆分为单独的路径:

      { "/api/v1/**,/api/v2/**", "/api/foo.ico" }
      { "/api/v1/**", "/api/v2/**", "/api/foo.ico" }

    2. 将每个路径转换为正则表达式:

      • 如果路径不是以/**结尾,只需调用Pattern.quote(path)1

        "/api/foo.ico""\\Q/api/foo.ico\\E"

      • 如果路径以/**结尾,则引用除**之外的所有内容,并将其替换为.*

        "/api/v1/**""\\Q/api/v1/\\E.*"
        "/api/v2/**""\\Q/api/v2/\\E.*"

    3. 使用|或模式组合所有路径正则表达式:

      "\\Q/api/v1/\\E.*|\\Q/api/v2/\\E.*|\\Q/api/foo.ico\\E"

    4. 编译regex并使用matcher.matches()方法检查传入路径

    1)Pattern.quote()将文本用\Q\E环绕,并正确处理任何嵌入的\E

  2. # 2 楼答案

    你想要达到的目标可以通过正则表达式来实现

    public static void main(final String strg[]) {
            String pattern= "/api/(v1|v2)/.*";
            Matcher m = Pattern.compile(pattern).matcher("/api/v1/read");
            if(m.find()) {
                System.out.println("match found");
            }
        }
    

    与其将URI的每个可能性都添加到列表中,不如将它们添加到正则表达式中以创建模式