簡體   English   中英

正則表達式:檢查傳入的 uri 是否存在於列表中

[英]Regex: Check incoming uri is present in list

我正在嘗試編寫一個正則表達式來檢查傳入的 url 路徑是否與我的任何列表元素匹配。我該如何編寫?。 我嘗試使用String.contains(/api/v1/read)但它返回 false,即使它存在於列表中。

my path : /api/v1/read

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

任何幫助,將不勝感激

如果您需要支持的唯一通配符是以/**結尾的路徑,那么您可以按如下方式進行:

  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. 編譯正則表達式並使用matcher.matches()方法檢查傳入路徑。

1) Pattern.quote()將用\Q\E包圍文本,並正確處理任何嵌入的\E對。

您要實現的目標可以通過正則表達式來完成。

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 的每種可能性都添加到列表中,而是將它們添加到正則表達式中以創建一個模式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM