0

我有一个对象。

var NavigationController = function(config) {

    if(!config) {
        config = {};
    }

    if(!config.routes) {
        config.routes = {};
    }

    var getControllerByPath = function(path) {
        // I need to get Controller (UserController) if path matches in routes (/user/me)
    };
}

我可以用这个作为...

var navController = new NavigationController({
    routes : {
        '/user/:action' : 'UserController',
        '/app/:action' : 'AppController',
        '/file/:action' : 'FileController',
        '/feedback/:action' : 'FeedbackController'
    }
});

navController.navigate(req, res);

目前,我正在为每条路由生成正则表达式字符串,然后将其与路径字符串匹配,它有效,但效率高吗?

4

1 回答 1

0

正则表达式似乎是解决这个问题的好方法。您可以扫描并查找 / 和 : 但您也可以编写您的正则表达式而无需回溯,这可以帮助您提高性能。

如果您尝试使其高性能,您将花费大量时间编写可能根本不需要的算法......您确定这是您的应用程序需要性能改进的地方吗?预优化通常是最常见的错误之一,您最好的办法可能是在您的应用程序中获取您的逻辑,然后尝试找出哪些部分很慢并优化这些部分。

我希望这有帮助!

编辑:我正在谈论的那种正则表达式的例子:

假设问题是将字符串中的所有内容匹配到字母 k,大多数人会建议:

.*k

但这匹配字符串,如:“hijk”和“hijkhijkh”(分别匹配 hijk、hijkhink)。这是因为这个正则表达式实际上是在说“抓住所有东西,看看最后一个字符是否是 k。如果不是,则删除该字符并向后工作,直到它变为真或没有更多字符了。”

如果你想匹配第一个 k,你可以这样做:

.*?k

这就是说:“一次抓取一个字符,看看它是否与模式匹配(以 k 结尾)。如果不匹配,请继续抓取,直到令牌匹配或直到没有任何东西可以匹配并且找不到匹配项。”

您可以利用它一次抓取一个字符...贪婪运算符立即扫描字符串,因此 O(n) 开始。我介绍的后一个版本可能有一个更好的最佳情况,因为它在找到第一个匹配之前一直有效......但是如果这是一个瓶颈,你应该真的用你的应用程序尝试这些并测试它们,因为它真的依赖于您的应用在平均情况下使用的数据类型。

于 2012-07-12T16:04:00.823 回答