[英]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/**"};
任何幫助,將不勝感激
如果您需要支持的唯一通配符是以/**
結尾的路徑,那么您可以按如下方式進行:
將任何以逗號分隔的字符串拆分為單獨的路徑:
{ "/api/v1/**,/api/v2/**", "/api/foo.ico" }
→ { "/api/v1/**", "/api/v2/**", "/api/foo.ico" }
將每個路徑轉換為正則表達式:
如果路徑不以/**
結尾,只需通過調用Pattern.quote(path)
1來引用它:
"/api/foo.ico"
→ "\\Q/api/foo.ico\\E"
如果路徑以/**
結尾,請引用除**
之外的所有內容並將其替換為.*
:
"/api/v1/**"
→ "\\Q/api/v1/\\E.*"
"/api/v2/**"
→ "\\Q/api/v2/\\E.*"
使用|
組合所有路徑正則表達式或模式:
→ "\\Q/api/v1/\\E.*|\\Q/api/v2/\\E.*|\\Q/api/foo.ico\\E"
編譯正則表達式並使用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.