Javascript 正则表达式是否正确反对我正在尝试做的事情?

Javascript 正则表达式是否正确反对我正在尝试做的事情?,javascript,regex,node.js,webserver,Javascript,Regex,Node.js,Webserver,我正在创建一个可重用的node.jsNavigationController类,以便在其他服务器端项目中重用它(如果需要或者其他人可能会发现它很有用) 下面是用例 var navController = new NavigationController({ routes : { '/user/:action/:anything' : 'UserController', '/app/:action' : 'AppController', '/

我正在创建一个可重用的node.jsNavigationController类,以便在其他服务器端项目中重用它(如果需要或者其他人可能会发现它很有用)

下面是用例

var navController = new NavigationController({
    routes : {
        '/user/:action/:anything' : 'UserController',
        '/app/:action' : 'AppController',
        '/file/:action' : 'FileController',
        '/feedback/:action' : 'FeedbackController',
        '/:anything' : 'ErrorController'
    },
    ErrorController : 'ErrorController'
});
navController.init();
服务器请求时,用户可以调用该对象的此函数

navController.navigate(req, res);
现在这个和控制器被正确地调用。导航(req,res)函数下的内容是基于URL调用适当控制器对象的一部分,它被定义为名为getRouteByPath(path)的函数。此私有函数将获取路由,并允许导航(req,res)函数获取要调用的控制器类名

var getRouteByPath = function(path) {
    for(var route in config.routes) {
        var routeRegex = '';

        var routeParts = route.split('/');

        for(var rp = 0; rp < routeParts.length; rp++) {

            // checking if route part starts with :
            if(routeParts[rp].indexOf(':') === 0) {

                // this is "anything" part
                routeRegex += '[/]?([A-Za-z0-9]*)';

            } else if(routeParts[rp] != "") {
                routeRegex += '[/]?' + routeParts[rp];
            }
        }

        var routeRegexResult = path.match(routeRegex);
        if(routeRegexResult) {
            console.log(routeRegexResult);
            return route;
        }
    }
    return null;
};
var getRouteByPath=函数(路径){
for(config.routes中的变量路由){
var routeRegex='';
var routeParts=route.split('/');
对于(var rp=0;rp
我太担心这个函数了,好像这是正确的方法一样?

一些缺陷:

  • 为什么将斜杠用作字符类(
    [/]
    )?不需要这样做,只需要在正则表达式文本中使用反斜杠(如
    /\//g
    )对其进行转义。只需使用一个“
    /
    ”(
    newregexp(“/”,“g”)

  • .indexOf()==0
    确实有效,但搜索整个字符串并不是很有效。更好地使用,在您的情况下
    routePart.charAt(0)=“:”

  • .match()
    -我建议构建一个新的和使用,因为您不想匹配-我认为也没有必要构建捕获组,因为您只返回路由字符串,而不返回匹配项(好的,您可以记录它们)

  • 是否要检查整个
    路径
    是否与您的regexp匹配?别忘了添加
    ^
    $
    。AppController的当前正则表达式也与路径匹配,如
    /user/app/example

  • 为什么斜杠(只有斜杠)是可选的(
    /?
    )?不仅我不认为这是您想要的,而且它还为构建正则表达式打开了大门,比如
    /\/?user\/?([A-Za-z0-9]*)\/?([A-Za-z0-9]*)/

    要避免这种情况,您需要将整个组设置为可选:
    (?:/([^/]*)?

  • 此外,您应该只构建一次正则表达式(初始化时),并将它们存储在缓存中,而不是每次调用
    getRouteByPath
    时都构建它们。
    RegExp
    的编译隐藏在代码中的某个地方,尽管它需要进行编译

一些注意事项:

routeRegex += '[/]?([A-Za-z0-9]*)';
表示路线可能存在,也可能不存在。
/
将匹配。
+
可能比
*
更合适

另外,由于我瘦
\uuuz
是允许在web路由中使用的


您的
.split('/')
将从路由中删除所有
/
,因此它不应位于此问题所属的拆分列表中。根据在适当站点发布问题的定义,StackOverflow应该只包含与溢出堆栈相关的问题:)不要在此处使用
exec
,使用
RegExp.prototype.test
。另外,
routePart.indexOf(':')==0
最好写为
routePart.charAt(0)=':'
。谢谢,这正是我的意思:-)还要添加indexOf东西[/])?这是因为如果定义的路由类似于/user/:action/:anywhere,并且用户请求URL/user/me或/uer/me/you,那么控制器将在两个请求中都被调用。这不是正常的做法吗?你能解释一下这一点吗?“为什么要将斜杠(/)用作字符类?不需要这样做,只有在正则表达式文本中,才需要用反斜杠对其进行转义。”每次使用字符串调用
match
,都会创建一个字符类,尽管这是一个相对庞大的计算,但代码中不会注意到“编译”。另请参见我的最后一点[/]?这是因为如果定义的路由类似于/user/:action/:anywhere,并且用户请求URL/user/me或/uer/me/you,那么控制器将在两个请求中都被调用。这不是正常的做法吗?对,我的大脑屏蔽了你将它们全部附加在一起的事实,还有
[/]?
说它可能存在,也可能不存在,我们不总是希望它存在吗?