繁体   English   中英

如何使用RegEx有效解决此问题

[英]How can I use RegEx to solve this efficiently

我有一个对象。

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

目前,我正在为每个路由生成正则表达式字符串,然后将其与路径字符串匹配,它可以工作,但是效率很高吗?

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

如果您想使其表现出色,则会花费大量时间来编写根本不需要的算法...您确定这是您的应用程序需要提高性能的地方吗? 预优化通常是最常见的错误之一,您最好的选择可能是将逻辑纳入您的应用程序,然后尝试找出哪些部分运行缓慢并对其进行优化。

希望对您有所帮助!

编辑:我正在谈论的这种正则表达式的示例:

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

。* k

但这会匹配字符串:“ hijk”和“ hijkhijkh”(分别匹配hijk和hijkhink)。 这是因为此正则表达式实际上是在说“抓住所有内容,看看最后一个字符是否为k。如果不是,则删除该字符并向后工作,直到它变为true或不再有其他字符为止。”

如果要匹配第一个k,则可以执行以下操作:

。*?k

这就是说:“一次抓住一个字符,看看它是否与模式匹配(以k结尾)。如果不匹配,请继续抓取直到令牌匹配,或者直到没有匹配的对象并且找不到匹配为止。”

您可以利用它一次捕获一个字符...贪婪的运算符会立即扫描字符串,因此O(n)开始。 我介绍的后一个版本可能会有更好的最佳情况,因为它可以一直工作到找到第一个匹配项为止...但是您真的应该在您的应用中进行尝试并对其进行性能测试,因为这实际上是一个瓶颈,因为它实际上取决于您的应用使用的平均数据类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM