用于解析url的正则表达式

时间:2014-01-20 05:15:42

标签: javascript regex

我想在Javascript中获取正则表达式:

/something/:workspaceId/somethingelse/:userId/blah/:id

解析后我得到一个['workspaceId', 'userId', 'id']的数组。

初步测试:

p.match(/:.*?\/+/g )

这只匹配前两个,workspaceId和userId。

这感觉有点像黑客:

(p + '/').match(/:.*?\/+/g )

它仍会返回:workspaceId而不是workspaceId

尝试使用我认为括号应该用于修复它:

(p + '/').match(/:(.*)?\/+/g )

这最后一个真的应该工作,但不会(因为有括号,我希望regexp只返回括号中的匹配)。

目前,我正在做:

r = (p + '/').match(/:.*?\/+/g).map( function(i){return i.substr(1, i.length - 2 )  } );

但我很乐意得到一些东西:

1)最后不添加'/'(尽管我可以忍受)

2)它没有使用昂贵的map()方法来执行regexp应该在第一时间做的事情

2 个答案:

答案 0 :(得分:1)

1:你需要像这样逃避正斜杠:

\/something\/:workspaceId\/somethingelse\/:userId\/blah\/:id

2:添加捕获组以捕获所需的内容,如下所示:

\/something\/:(.*?)\/somethingelse\/:(.*?)\/blah\/:(.*?)

3:将整个内容放在javascript Regexp分隔符中,/.../

/\/something\/:(.*?)\/somethingelse\/:(.*?)\/blah\/:(.*?)/

4:执行正则表达式

var rexp = /\/something\/:(.*?)\/somethingelse\/:(.*?)\/blah\/:(.*?)/;
var matched = rexp.exec(string_to_match);

你将拥有:

  

匹配[0] =>整个匹配的字符串
  匹配[1] =>第一个捕获组,workspaceId
  匹配[2] =>第二个捕获组,userId
  匹配[3] =>第三个捕获组,id

5:从良好的在线资源中学习正则表达式

编辑为了使其更通用,请使用:

var rexp = /\/.*?\/:(.*?)\/.*?\/:(.*?)\/.*?\/:(.*?)/;

答案 1 :(得分:1)

你可以使用一个预见断言正则表达式,如下所示:

(?=:):(.*?)(?=\/|$)

工作示例:

http://regex101.com/r/gO7nO0

匹配

MATCH 1
1.  
`workspaceId`
MATCH 2
1.  
`userId`
MATCH 3
1.  
`id`

或者更好的是,您可以简化并使用:

:(\w+)

工作示例:

http://regex101.com/r/nG4mI2

匹配

MATCH 1
1.  
`workspaceId`
MATCH 2
1.  
`userId`
MATCH 3
1.  
`id`

修改

这是一个有效的纯javascript示例:

http://jsfiddle.net/BkbrF/2/