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

时间:2013-07-07 21:38:25

标签: javascript regex

我正在开发一个用于客户端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'

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

我可以轻松匹配可选的:name:format细分,但两者都不存在,但我无法区分:name:format在场。

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

> 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