繁体   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