簡體   English   中英

匹配 URL 路徑模式的正則表達式

[英]Regex to match URL Path pattern

我有 2 個 URI 模式及其正則表達式:

1. "/api/orders/{id}/{version}"   ->      "^/api/orders/.+/.+$"
2. "/api/orders/{id}"             ->      "^/api/orders/.+$"

但是對於上面的正則表達式,字符串/api/orders/123-blah$-789/v1匹配正則表達式模式 1 和 2。

我可以使用什么正則表達式使上面的字符串只匹配模式 1 的正則表達式而不匹配模式 2?

(路徑可能是也可能不是 URL 編碼)

你可以用這個替換你的第二個正則表達式:

^\/api\/orders\/[[\p{Alnum}\p{Punct}]&&[^\/]]+$

基本上,它接受orders/之后的每個符號或字母字符,除非那里有斜線。 像這樣,您可以保證orders/后面只有一個子路徑。

這是測試正則表達式的鏈接:

https://regex101.com/r/KMEeXX/2

同樣,第一個正則表達式可以在與第二個相同的前提下重寫:

^\/api\/orders\/.+/[[\p{Alnum}\p{Punct}]&&[^\/]]+$

這是一個測試它的鏈接:

https://regex101.com/r/AW6cDh/1

您可以通過使用否定字符 class [^/]+匹配 1+ 個字符(不包括正斜杠)來限制這兩種模式。

對於第一個模式,您可以使用:

^/api/orders/[^/]+/[^/]+$

正則表達式演示

對於第二種模式,您可以使用

^/api/orders/[^/]+$

正則表達式演示

這可能看起來有點硬編碼,但可以完成工作。
我個人更喜歡正則表達式非常具體。

    Pattern p = Pattern.compile("^/api/orders/.+/.+$");
    Pattern q = Pattern.compile("^/api/orders/[^/]+$");
    
    System.out.println(p.matcher("/api/orders/123-456-789/v1").matches());
    System.out.println(q.matcher("/api/orders/123-456-789/v1").matches());

    System.out.println(p.matcher("/api/orders/123-456-789").matches());
    System.out.println(q.matcher("/api/orders/123-456-789").matches());

暫無
暫無

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

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