【问题标题】:URL route matching with Regex与正则表达式匹配的 URL 路由
【发布时间】:2014-01-12 09:15:18
【问题描述】:

我正在尝试构建自己的 URL 路由匹配引擎,尝试使用正则表达式匹配路由。

例如,让我们考虑这样一种场景:服务器应用程序允许设置自定义参数化路由,然后在路由被 HTTP 请求调用时执行一个函数。开发者可以创建以下路由:

  • /users/:id/doSomething
  • /hello/world
  • /:format/convert

它们中的每一个都将与不同的请求处理程序/函数相关联。

现在,对于传入的请求,服务器应该能够将请求的路径匹配到正确的处理程序。因此,例如,如果客户端应用程序请求 http://myservice.com/users/john/doSomething,服务器应该能够判断请求的 URL 属于 /users/{id}/doSomething 路由定义,然后执行关联的处理程序。

我个人构建路由匹配器的方式是获取请求的 URL,遍历路由定义,如果定义与请求的 URL 匹配,则执行处理程序。棘手的部分是动态参数匹配。

您将如何构建与 URL 段匹配的正则表达式?

编辑

我目前正在使用以下正则表达式来匹配段:([^/\?])+

例如,要检查请求路径是否属于我将匹配的第一个路由:

/users/([^/])+/doSomething

这是一个非常宽松的正则表达式。

【问题讨论】:

  • 我很惊讶我不得不问你你尝试了什么。
  • 已更新为当前实现。
  • @Mark 在您的编程语言中没有解析 url 的好函数吗?但是您可以使用 \/([^\/\?]+) 作为您的正则表达式!

标签: regex url match


【解决方案1】:

解决方案

首先关注开发人员如何创建路线。她必须输入什么来输入动态参数?那么编写动态参数匹配会更容易。

示例

在 Java 方面,我最近与 Jersey 一起工作。以下是如何定义 url 路由:

/api/{id:[\dA-F]+}.{type:(?:xml|json|csv)}

一些预期的网址:

/api/EF123.csv /api/ABC.json /api/1234567890.xml

匹配器将解析开发人员提供的路由,以使用如下正则表达式查找动态参数:

{([^:]+)\s*:\s*(.+?)(?<!\\)}

查看演示:http://regex101.com/r/iH1gY3

完成后,匹配器可以动态构建下面的正则表达式来匹配路由:

/api/[\dA-F]+\.(?:xml|json|csv)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 2022-08-11
    • 2012-06-07
    • 1970-01-01
    • 2011-11-05
    相关资源
    最近更新 更多