通过所有:URL中的令牌没有":"

时间:2014-05-26 01:45:12

标签: javascript regex

想象一下你有:/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 ) );
}

感觉丑陋和尴尬。 有更好的方法吗?

3 个答案:

答案 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)

使用简单的splitloop

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"]