Javascript 如何使用RegEx有效地解决这个问题

Javascript 如何使用RegEx有效地解决这个问题,javascript,node.js,Javascript,Node.js,我有一个目标 var NavigationController = function(config) { if(!config) { config = {}; } if(!config.routes) { config.routes = {}; } var getControllerByPath = function(path) { // I need to get Controller (UserCo

我有一个目标

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。如果不是,则删除该字符并向后工作,直到它变为真,或者不再剩下字符。”

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

*k

这是说:“一次抓取一个字符,看看它是否与模式匹配(以k结尾)。如果不匹配,则继续抓取,直到标记匹配,或者直到没有剩余的匹配项,并且没有找到匹配项为止。”


你可以利用它一次抓取一个字符…贪婪的操作符会立即扫描字符串,所以从O(n)开始。我介绍的后一个版本可能会有一个更好的最佳案例场景,因为它在找到第一个匹配项之前一直有效……但如果这是一个瓶颈,你应该在你的应用程序中尝试这些,并对它们进行性能测试,因为它实际上取决于你的应用程序在平均情况下使用的数据类型

你能给我举个例子吗?我正在通过每个路由生成正则表达式,并附带条件检查是否存在/或:然后适当地使用正则表达式语法,但如果您是我,您将如何做到这一点?当然,我可以提供帮助,但我需要澄清一点:您是否查找a/或a:,或者是否存在一个限制,即:前面总是有a/?据我所知,你正在尝试做一些像rails路由器这样的魔术?我正在对我的答案进行编辑(真的是一个补充)所以,5分钟左右再回来看看:)是的,我试图让用户编写regex可能像rails一样,但我从Sencha Touch controller复制了这个概念。SenchaTouch提供了一个非常复杂的路由配置,允许用户将自定义regex与本机regex一起编写,并编译和调用适当的函数。