我正在尝试构建自己的URL路由匹配引擎,尝试使用正则表达式匹配路由。
例如,让我们考虑服务器应用程序允许设置自定义参数化路由然后在HTTP请求调用它的路由时执行函数的场景。开发人员可以创建以下路由:
/users/:id/doSomething
/hello/world
/:format/convert
它们中的每一个都将与不同的请求处理程序/函数相关联。
现在,在传入请求中,服务器应该能够将请求的路径与正确的处理程序匹配。因此,例如,如果客户端应用程序请求http://myservice.com/users/john/doSomething
,则服务器应该能够告知所请求的URL属于/users/{id}/doSomething
路由定义,然后执行关联的处理程序。
就个人而言,我建立路径匹配器的方式是获取请求的URL,遍历路由定义,如果定义与请求的URL匹配,则执行处理程序。棘手的部分是动态参数匹配。
您将如何构建与URL段匹配的正则表达式?
修改:
我目前正在使用以下正则表达式来匹配细分:([^/\?])+
。
例如,要检查请求路径是否属于我将匹配的第一条路线:
/users/([^/])+/doSomething
这是一个非常宽容的正则表达式。
答案 0 :(得分:4)
首先关注开发人员可以创建路线的 。输入动态参数时必须输入什么?然后编写动态参数匹配将更容易。
在Java中,我最近在泽西岛工作过。以下是如何定义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)