想象一下你有:/users/:userId/goals/:goalId/list
。
我想在这个字符串中创建一个包含all:tokens的数组,而不是“:”。
我现在正在这样做:
var tokens = [];
var elements = target.match(/:(\w*)/g);
for( var i = 0, l = elements.length; i < l; i ++){
tokens.push( elements[ i ].substr( 1 ) );
}
感觉丑陋和尴尬。 有更好的方法吗?
答案 0 :(得分:2)
怎么样:
var myRegexp = (/(?::)(\w+)/g);
var test = "/users/:userId/goals/:goalId/list";
match = myRegexp.exec(test);
while (match != null) {
alert(match[1]);
match = myRegexp.exec(test);
}
(?::)
创建非捕获组
或者您也可以尝试:
"/users/:userId/goals/:goalId/list".replace(/\/\w*/g,"").split(':')
输出:["", "userId", "goalId"]
答案 1 :(得分:1)
我之前可能已将其发布到其他形状中,但这里有一个很小的功能,可以更好地match
使用全局标记和捕获组:
String.prototype.gmatch = function(regex) {
var result = [];
this.replace(regex, function() {
var matches = [].slice.call(arguments, 1, -2);
result.push.apply(result, matches);
});
return result;
};
并使用它:
var str = '/users/:userId/goals/:goalId/list'
var tokens = str.gmatch(/:(\w+)/g); //=> ['userId', 'goalId']
答案 2 :(得分:0)
使用简单的split
和loop
var test = "/users/:userId/goals/:goalId/list";
var s=test.split("/");
var result = [];
for (var i = 0; i < s.length; i++){
if (s[i][0] == ":"){
result.push(s[i].split(":")[1]);
}
}
console.log(result);
结果:
["userId", "goalId"]