使用基于正则表达式的路由约束是不是很糟糕?

时间:2012-03-01 19:38:06

标签: regex asp.net-mvc asp.net-mvc-routing

我有以下路径将在我的ASP.NET MVC网站上广泛播出:

    routes.MapRoute(
        null,
        "products/{ProductID}/{SeoName}",
        new { controller = "Product", action = "ProductDetails", SeoName = UrlParameter.Optional }
    );

我想确保ProductID是一个有效的整数。我知道我可以使用基于正则表达式的路由约束或使用类似于int.TryParse()的自定义路由约束来执行此操作。

在我看来,正则表达式是非常昂贵的操作,我不想为每个访问我网站的请求运行一个,但我似乎找不到任何说明我应该小心使用正则表达式的信息基于路线的约束。

所以我的问题是,我应该使用基于正则表达式的路由约束还是自定义路由约束来验证参数是否为整数?

2 个答案:

答案 0 :(得分:5)

Sam Saffron在博客中介绍了他在StackExchange网站上所做的优化。他所做的一件事就是摆脱尽可能多的正则表达式约束。如果你只需要确保某个东西是一个整数,那么用自定义的IRouteConstraint实现替换正则表达式约束是相当简单的。 Sam的帖子有一个他用于此事的代码示例。请在此处查看:http://samsaffron.com/archive/2011/10/13/optimising-asp-net-mvc3-routing

尽管如此,除非您的网站获得大量流量,并且/或者您拥有大量路线,否则不太可能导致性能问题。直到我得到一个网站工作并启动之后,我才会担心这样做。

答案 1 :(得分:0)

虽然我不完全确定.Net正则表达式引擎如何对这样的简单正则表达式执行 - 如CS课程所知,有限自动机可以在线性时间内识别常规语言。要确定字符串是否为数字,您需要以任何方式访问字符串的每个字符,因此理论上它应该无关紧要。

然而,正如其他一个答案所述,Int32.TryParse可能更适合这样做(以某种奇怪的方式),因此可能会稍微快一点。

但是编译后的正则表达式确实应该对普通用户做得很好,除非正则表达式引擎的实现绝对可怕。当然这是假设你的正则表达式实际上是识别一种常规语言(即向前看并看后面是一个nono,而你的正则表达式不能引起任何类型的回溯) - 测试一个整数是。

然而,如上所述,请注意我没有对此进行任何测试,因此我没有真正的数据来支持这些声明。