通过与令牌替换字符串进行比较来确定令牌值

时间:2013-08-08 12:20:05

标签: javascript regex

我有一个像这样的象征化字符串;

var route = a/b/{firstId}/c/d/{nextId}

我想知道是否可以使用正则表达式通过第二个字符串获取“firstId”的值,并且已经替换了令牌。

示例,如果我有一个给定的字符串;

var partPath = a/b/33

我可以做类似的事情;

function getValueFromPath(path, route){
    //regex stuff
    return tokenValue; //Expected result 33
}

getValueFromPath(partPath, route);

谢谢,

下进行。

2 个答案:

答案 0 :(得分:1)

正则表达式解决方案过于复杂(如果您没有立即使用正则表达式定义route)。我只是用

function getValueFromPath(path, route){
    var actualParts = path.split("/"),
        expectedParts = route.split("/"),
        result = {};
    for (var i=0; i<expectedParts.length; i++) {
        if (i >= actualParts.length)
            return result;
        var actual = actualParts[i],
            expected = expectedParts[i];
        if (/^\{.+\}$/.test(expected))
            result[ expected.slice(1, -1) ] = actual;
        else if (actual != expected)
            // non-matching literals found, abort
            return result;
    }
    return result;
}
> getValueFromPath("a/b/33", "a/b/{firstId}/c/d/{nextId}")
{firstId: "33"}
> getValueFromPath("a/b/33/c/d/42/x", "a/b/{firstId}/c/d/{nextId}")
{firstId: "33", nextId: "42"}

这与“正则表达式的东西”是一样的(注意路线中的正则表达式特殊字符没有被转义,你必须自己照顾它):

function getValueFromPath(path, route){
    var keys = [];
    route = "^"+route.split("/").reduceRight(function(m, part) {
        return part + "(?:/" + m + ")?"; // make right parts optional
    }).replace(/\{([^\/{}]+)\}/g, function(m, k) {
        keys.push(k); // for every "variable"
        return "([^/]+)"; // create a capturing group
    });
    var regex = new RegExp(route); // build an ugly regex:
    // regex == /^a(?:\/b(?:\/([^/]+)(?:\/c(?:\/d(?:\/([^/]+))?)?)?)?)?/
    var m = path.match(regex),
        result = {};
    for (var i=0; m && i<keys.length; i++)
        result[keys[i]] = m[i+1];
    return result;
}

答案 1 :(得分:0)

您可以创建这样的正则表达式:

function getValueFromPath(path, route){
    tokenValue = path.match(route)[1];
    return tokenValue; //Expected result 33
}

var route = /\/a\/b\/([^\/]+)(\/c\/d\/([^\/]+))?/;
var partPath = '/a/b/33';
getValueFromPath(partPath, route); // == 33

http://jsfiddle.net/firstclown/YYvvn/2/

这样您就可以在第一次匹配时使用[1]提取第一个值,然后通过将其更改为[3]来获取nextId(因为[2]将为您提供完整路径33)。