正则表达式以匹配javascript中的uri段

Regular expression to match uri segment in javascript

本文关键字:中的 uri javascript 正则表达式      更新时间:2023-09-26

我正在为客户端MVC应用程序开发JavaScript路由器引擎。。。像Backbone或Spine这样的东西也参与其中。

我的路由器需要匹配可选地包括资源标题和可选地包括请求格式的URI段。

我希望捕获资源:id、可选:name段和可选:format段,这样:

/123              => id:'123', name: undefined, format: undefined
/123-my-name      => id:'123', name:'my-name',  format: undefined
/123.html         => id:'123', name: undefined, format:'html'
/123-my-name.html => id:'123', name:'my-name',  format:'html'

EDIT:还有其他路由将与嵌套路径匹配,因此此表达式不应与/123-my-name/edit/123-my-name/edit.html 匹配

当可选的:name:format段不同时存在时,我可以很容易地匹配它们,但当两者都存在时,很难区分:name:format

有什么建议吗?

> re = /'/('w+)(?:-('w[-'w]+))?(?:'.(html))?/
/'/('w+)(?:-('w[-'w]+))?(?:'.(html))?/
> "/123".match(re)
["/123", "123", undefined, undefined]
> "/123-my-name".match(re)
["/123-my-name", "123", "my-name", undefined]
> "/123.html".match(re)
["/123.html", "123", undefined, "html"]
> "/123-my-name.html".match(re)
["/123-my-name.html", "123", "my-name", "html"]

然后,

 m = url.match(re)
 id = m[1]
 name = m[2] || default
 format = m[3] || default

更具体的选项(id=仅数字,锚定):

> re = /^'/('d+)(?:-('w[-'w]+))?(?:'.(html))?$/
/^'/('d+)(?:-('w[-'w]+))?(?:'.(html))?$/
> "/123-my-route/edit.html".match(re)
null