动态路由的实现—正则表达式

文章目录


前言

动态路由有很多种实现方式,支持的规则、性能等有很大的差异。例如开源的路由实现gorouter支持在路由规则中嵌入正则表达式,例如/p/[0-9A-Za-z]+,即路径中的参数仅匹配数字和字母。

最近在看cpp-httplib源码的时候,发现这个开源库是也是利用正则化来实现动态路由的。本文就来总结httplib是如何利用正则表达式来进行动态路由的,

一、什么是正则表达式?

正则表达式是一种用于描述字符串模式的工具。它由一系列字符和特殊字符组成,可以用来匹配、搜索、替换和提取字符串中的特定模式。正则表达式提供了一种灵活而强大的方式来处理各种字符串操作。
正则表达式的语法和例子

正则表达式的语法由普通字符和特殊字符组成。普通字符表示它们自身,而特殊字符具有特殊的含义和功能。

正则表达式的特殊字符包括:

.:匹配任意字符(除了换行符)。

*:匹配前面的元素零次或多次。

+:匹配前面的元素一次或多次。

?:匹配前面的元素零次或一次。

\]:定义字符集,匹配其中的任意一个字符。 ():捕获分组,用于提取匹配结果。 \\:转义字符,用于匹配特殊字符本身。 # 二、正则表达式在动态路由中的作用 动态路由是一种常见的路由处理方式,它允许根据请求的路径来选择相应的处理函数。正则表达式在动态路由中的作用是用于匹配和提取请求路径中的参数。 在动态路由中,我们可以使用正则表达式来定义路径模式,以便根据请求的路径来选择相应的处理函数**加粗样式** 。例如,我们可以使用正则表达式来匹配带有数字参数的路径(如/products/123),或者匹配带有字母参数的路径(如/products/abc)。 通过使用正则表达式,我们可以灵活地匹配各种不同的路径格式,并提取匹配的参数。在路由分发器中,我们可以使用正则表达式的regex_match函数来尝试匹配请求路径和每个路由处理程序的路径模式。如果匹配成功,我们可以访问和使用匹配的结果,例如提取数字参数或字母参数。 通过正则表达式的匹配和提取功能,我们可以根据不同的请求路径选择相应的处理函数,并使用提取的参数执行相应的逻辑操作。这使得动态路由更加灵活和强大,能够处理各种不同的请求路径和参数。 # 三、实现一个简单的路由调度器 使用正则表达式来匹配请求的 URL,并根据匹配结果调用相应的处理程序。通过使用正则表达式,我们可以灵活地定义 URL 模式,并根据请求的 URL 动态地匹配和调度处理程序。 **首先,我们定义了 Handler 类型**,它是一个接受两个字符串参数的函数对象。然后,我们定义了 Handlers 类型,它是一个存储了正则表达式和处理程序的向量。 **接下来,我们有一个 Post 函数**,它接受一个 URL 模式和一个处理程序,并将它们作为键值对存储在 post_handlers_ 向量中。在这里,我们使用 std::regex 来将 URL 模式编译为正则表达式,并将其与处理程序一起存储。 **最后,我们有一个 dispatch_request 函数** ,它接受请求字符串、响应字符串和处理程序的向量作为参数。该函数遍历处理程序向量,对每个处理程序执行以下操作: 1.获取存储在键值对中的正则表达式和处理程序。 2.使用std:regex_match函数来检查请求字符串是否与正则表达式匹 配。如果匹配成功,将匹配结果存储在std::smatch对象m中。 3.执行处理程序,并将请求字符串和响应字符串作为参数传递给它。 4.返回true表示成功匹配并调用了处理程序。 如果没有找到匹配的处理程序,函数将返回 false,表示未能处理该请求。 ```cpp using Handler = std::function; using Handlers = std::vector>; Handlers post_handlers_; void Post(const std::string &pattern, Handler handler) { post_handlers_.push_back( std::make_pair(std::regex(pattern), std::move(handler))); return ; } inline bool dispatch_request(string &req, string &res, const Handlers &handlers) { for (const auto &x : handlers) { const auto &pattern = x.first; const auto &handler = x.second; std::smatch m; if (regex_match(req, m, pattern)) { // pattern 如果匹配 req 那么就回吧结果匹配到m中 cout<<"/match"<

相关推荐
tan180°2 小时前
MySQL表的操作(3)
linux·数据库·c++·vscode·后端·mysql
彭祥.4 小时前
Jetson边缘计算主板:Ubuntu 环境配置 CUDA 与 cudNN 推理环境 + OpenCV 与 C++ 进行目标分类
c++·opencv·分类
会飞的鱼先生4 小时前
Node.js-http模块
网络协议·http·node.js
lzb_kkk4 小时前
【C++】C++四种类型转换操作符详解
开发语言·c++·windows·1024程序员节
胖大和尚6 小时前
clang 编译器怎么查看在编译过程中做了哪些优化
c++·clang
钱彬 (Qian Bin)7 小时前
一文掌握Qt Quick数字图像处理项目开发(基于Qt 6.9 C++和QML,代码开源)
c++·开源·qml·qt quick·qt6.9·数字图像处理项目·美观界面
双叶8367 小时前
(C++)学生管理系统(正式版)(map数组的应用)(string应用)(引用)(文件储存的应用)(C++教学)(C++项目)
c语言·开发语言·数据结构·c++
源代码•宸8 小时前
C++高频知识点(二)
开发语言·c++·经验分享
jyan_敬言9 小时前
【C++】string类(二)相关接口介绍及其使用
android·开发语言·c++·青少年编程·visual studio
liulilittle9 小时前
SNIProxy 轻量级匿名CDN代理架构与实现
开发语言·网络·c++·网关·架构·cdn·通信