0

我有一个像这样的标记字符串;

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);

谢谢,

C。

4

2 回答 2

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;
}
于 2013-08-08T12:30:17.263 回答
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]并且您可以通过将其更改为来获取 nextId [3](因为[2]将在 33 之后为您提供整个路径)。

于 2013-08-08T12:30:48.670 回答