我想在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应该在第一时间做的事情
答案 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)
你可以使用一个预见断言正则表达式,如下所示:
(?=:):(.*?)(?=\/|$)
工作示例:
匹配
MATCH 1
1.
`workspaceId`
MATCH 2
1.
`userId`
MATCH 3
1.
`id`
或者更好的是,您可以简化并使用:
:(\w+)
工作示例:
匹配
MATCH 1
1.
`workspaceId`
MATCH 2
1.
`userId`
MATCH 3
1.
`id`
修改强>
这是一个有效的纯javascript示例: