首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Regex对我想做什么是对的吗?

Regex对我想做什么是对的吗?
EN

Stack Overflow用户
提问于 2012-07-18 14:48:22
回答 2查看 102关注 0票数 0

我正在创建一个可重用的NavigationController类,这样我就可以在其他服务器端项目中重用它,如果我需要或者其他人可能发现它有用的话。

这是用例。

代码语言:javascript
复制
var navController = new NavigationController({
    routes : {
        '/user/:action/:anything' : 'UserController',
        '/app/:action' : 'AppController',
        '/file/:action' : 'FileController',
        '/feedback/:action' : 'FeedbackController',
        '/:anything' : 'ErrorController'
    },
    ErrorController : 'ErrorController'
});
navController.init();

服务器上的用户请求可以调用该对象的此函数。

代码语言:javascript
复制
navController.navigate(req, res);

现在,这和控制器被正确地调用了。基于getRouteByPath(path).调用适当控制器对象的导航(req,res)函数被定义为名为的函数。这个私有函数将获得路由,并允许导航(req,res)函数来获取控制器类名来调用。

代码语言:javascript
复制
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;
};

我太担心这个功能了,好像这是正确的方式吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-18 15:02:04

一些缺陷:

  • 为什么使用斜杠作为字符类([/])?不需要这样做,只是在regex文本中,您需要用反斜杠(如/\//g)来转义它。只需使用单个"/“(new RegExp("/", "g"))即可。
  • .indexOf(<string>)==0确实工作,但是搜索整个字符串,效率不高。最好使用起家,在您的例子中是routePart.charAt(0)==":"
  • <string>.match(<string>) -我建议构建一个新的对象并使用.test,因为您不想匹配--我认为也不需要构建捕获组,因为您只返回路由字符串,而不返回匹配(好的,您记录它们)。
  • 您想检查整个path是否与您的regexp匹配吗?别忘了添加^$。您当前对AppController的正则表达式还匹配像/user/app/example这样的路由。
  • 为什么您的斜杠(只有斜杠)是可选的(/?)?不仅我不认为这是您想要的,而且在构建像灾难性回溯这样的正则表达式时,它也为/\/?user\/?([A-Za-z0-9]*)\/?([A-Za-z0-9]*)/打开了大门 要避免这种情况,需要将整个组设置为可选的:(?:/([^/]*))?
  • 另外,您应该只构建一次正则表达式(在初始化时)并将它们存储在缓存中,而不是每次调用getRouteByPath时都构建它们。RegExp的编译隐藏在您的代码中,尽管它需要进行。
票数 2
EN

Stack Overflow用户

发布于 2012-07-18 15:03:23

几个注意事项:

代码语言:javascript
复制
routeRegex += '[/]?([A-Za-z0-9]*)';

表示路由可能存在也可能不存在,//将与之匹配,也许+*更适合。

另外,由于我在web路由中允许使用瘦_

您的.split('/')将从路由中删除所有/,因此不应该在拆分列表中

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11544134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档