动态路由的实现—正则表达式
文章目录
- 前言
- 一、什么是正则表达式?
- 二、正则表达式在动态路由中的作用
- 三、实现一个简单的路由调度器
- 总结
前言
动态路由有很多种实现方式,支持的规则、性能等有很大的差异。例如开源的路由实现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,表示未能处理该请求。
using Handler = std::function<void(const string &, string &)>;
using Handlers = std::vector<std::pair<std::regex, Handler>>;
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"<<endl;for (const auto& match : m) {std::cout << match << " ";}cout<<endl;cout<<"/"<<endl;handler(req, res);return true;}}return false;
}
使用如下:
Post("/", homeHandler);Post("/products/(\\d+)/asd", productHandler);Post("/products/(\\w+)/asd$", contactHandler);string request = "/products/123/asd";string response;// 调度请求并处理if (dispatch_request(request, response, post_handlers_)) {cout << "Response: " << endl;cout << response << endl;} else {cout << "No matching route found." << endl;}
总结
通过使用正则表达式,我们可以定义灵活的路径模式,并根据请求的路径选择相应的处理函数。正则表达式还可以提取匹配的参数,使得动态路由能够处理各种不同的请求路径和参数。正则表达式的强大功能为动态路由的实现提供了便利和灵活性。
相关文章:
动态路由的实现—正则表达式
文章目录 前言一、什么是正则表达式?二、正则表达式在动态路由中的作用三、实现一个简单的路由调度器总结 前言 动态路由有很多种实现方式,支持的规则、性能等有很大的差异。例如开源的路由实现gorouter支持在路由规则中嵌入正则表达式,例如…...
Android实现超出固定行数折叠文字“查看全文“、“收起全文“
先上效果图 分析问题 网上有很多关于这个的代码,实现都过于复杂了,github上甚至还看到一篇文章600多行代码,结果一跑起来全是bug。还是自己写吧!!! 如果我们需要换行的"查看全文"、"收起全…...
Python上楼梯问题:递归解法探究(斐波那契变种)(记忆化递归)
文章目录 上楼梯问题:递归解法探究问题定义解决方案1. 递归2. 记忆化递归关于python memo{}默认参数和字典的语法语法功能版本信息注意事项 结论 上楼梯问题:递归解法探究 在这篇文章中,将对上楼梯问题进行深入探讨。上楼梯问题是一种常见的…...
AI重新定义音视频生产力“新范式”
// 编者按:AIGC无疑是当下的热门话题和场景。面对AI带来的技术变革和算力挑战,该如何应对?LiveVideoStackCon 2023上海站邀请到了网心科技副总裁武磊为我们分享网心在面对AI应用场景和业务需求下的实践经验。 文/武磊 编辑/LiveVideoStack …...
Jmeter生成可视化的HTML测试报告
Jmeter也是可以生成测试报告的。 性能测试工具Jmeter由于其体积小、使用方便、学习成本低等原因,在现在的性能测试过程中,使用率越来越高,但其本身也有一定的缺点,比如提供的测试结果可视化做的很一般。 不过从3.0版本开始&…...
5G技术与其对智能城市、物联网和虚拟现实领域的影响
随着第五代移动通信技术(5G)的到来,我们即将迈向一个全新的数字化世界。5G技术的引入将带来更高的速度、更低的延迟和更大的连接性,推动了智能城市、物联网和虚拟现实等领域的发展。 首先,5G技术将带来超越以往的网络速…...
leetcode做题笔记88. 合并两个有序数组
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。 注意:最终,合并后数组…...
stm32开关控制led灯泡(附Proteus电路图)
说明:我的灯泡工作电压2V,电流设置为10um,注意了不是10毫安时微安啊,要不然电流太小亮不起来的。 2:我用的开关不是按钮button而是switch, 3:PB0,PB1默认都是低电平,采用了PULLDOWN模式,如果设…...
win10 wsl ubuntu 更换版本为18.04 apt换国内源Python换国内源;默认root
控制面板里面应用模块找到Ubuntu,可以卸载或者移动到其他盘。 Microsoft 应用程序 - ubuntu https://apps.microsoft.com/store/search/ubuntu?hlzh-cn&glcn&rtc1 选择想要的版本安装。 cp /etc/apt/sources.list /etc/apt/sources.list.bak nano /etc/ap…...
C++ Primer 第1章 开始
C Primer 第1章 开始 1.1 编写一个简单的C程序1.1.1 编译、运行程序一、程序源文件命名约定二、从命令行运行编译器 练习 1.2 初识输入输出一、标准输入输出对象二、一个使用IO库的程序三、向流写入数据四、使用标准库中的名字五、从流读取数据六、完成程序 1.3 注释简介一、C中…...
【STM32 学习】电源解析(VCC、VDD、VREF+、VBAT)
VCC电源电压GND电源供电负电压(通常接地)VDD模块工作正电压VSS模块工作负电压VREFADC参考正电压VREF-ADC参考负电压VBAT电池或其他电源供电VDDA模拟供电正电压VSSA模拟供电负电压 一、VCC(供电电压) VCC是指芯片的电源电压&#…...
C语言实例_解析GPS源数据
一、GPS数据格式介绍 GPS(全球定位系统)数据格式常见的是NMEA 0183格式,NMEA 0183格式是一种用于导航设备间传输数据的标准格式,定义了一套规范,使得不同厂商的设备可以通过串行通信接口(常见的是RS-232&a…...
LVS+Keepalived
Keepalived概述: keepalived软件 就是通过vrrp协议实现高可用功能 vrrp通信原理: vrrp就是虚拟路由冗余协议,它的出现就是为了解决静态路由的单点故障vrrp是通过一种竞选的一种协议机制将路由交给某台vrrp路由器vrrp用ip多播的方式【多播地…...
uni-app根据经纬度逆解析详细地址
uni-app中的getLocation()方法可以获取到用户当前的地理位置(经纬度)、速度。 但是返回参数中的address在app中才会显示,小程序中不会显示,所以我们需要进行逆解析其地址,解析出它的地址信息。 1.首先要在腾讯位置服务…...
【数据结构】吃透单链表!!!(详细解析~)
目录 前言:一.顺序表的缺陷 && 介绍链表1.顺序表的缺陷2.介绍链表(1)链表的概念(2)链表的结构(3)链表的功能 二.单链表的实现1.创建节点的结构2.头文件函数的声明3.函数的实现ÿ…...
Linux 安全技术和防火墙
目录 1 安全技术 2 防火墙 2.1 防火墙的分类 2.1.1 包过滤防火墙 2.1.2 应用层防火墙 3 Linux 防火墙的基本认识 3.1 iptables & netfilter 3.2 四表五链 4 iptables 4.2 数据包的常见控制类型 4.3 实际操作 4.3.1 加新的防火墙规则 4.3.2 查看规则表 4.3.…...
Mac 开发 Tang Nano FPGA 指南(使用终端和使用 VS Code 和插件,适用所有 Gowin FPGA)
最近收到了一个 Tang nano 9K FPGA开发板,就想借此机会研究一下。 官方文档里介绍如果想使用高云的 FPGA,就需要使用 GOWIN IDE,但是需要申请 license 提交一堆资料,我是别人送的就不太方便让别人弄。加上 IDE 其实并不是很适合学…...
基于深度学习的铁路异物侵限检测算法研究_整体认知感觉欠点意思,但是有一个新的变形卷积-Octave 卷积
相比于其他的交通运输方式,铁路运输具有准时性高、连续性强、速度快、运输量大、运输成本低以及安全可靠等优点。同时由于国家高速铁路网络建设的不断推进,铁路运输逐渐成为我国客运与货运的主要运输方式。虽然铁路运输为人们出行和货物运输带来的极大的…...
Spring项目使用Redis限制用户登录失败的次数以及暂时锁定用户登录权限
文章目录 背景环境代码实现0. 项目结构图(供参考)1. 数据库中的表(供参考)2. 依赖(pom.xml)3. 配置文件(application.yml)4. 配置文件(application-dev.yml)5…...
2023.8 - java - 变量类型
在Java语言中,所有的变量在使用前必须声明。声明变量的基本格式如下: type identifier [ value][, identifier [ value] ...] ; 格式说明: type -- 数据类型。identifier -- 是变量名,可以使用逗号 , 隔开来声明多个同类型变量…...
从零到部署:手把手教你用Django+OpenCV搭建一个能识别交通标志的“智能眼”(附完整源码)
实战指南:用DjangoOpenCV构建高精度交通标志识别系统 1. 环境配置与项目初始化 在开始构建交通标志识别系统前,需要准备完善的开发环境。以下是经过验证的配置方案: 核心工具栈选择: Python 3.9(推荐3.10.6版本&#x…...
AI-AGENT概念解析 - LLM任务训练
**问题:LLM大模型是否针对写作,做PPT,编写程序,拆解任务这些输入参数,用同一个大模型需要训练为不同的模型结构或参数化的权重矩阵去适应那些不同的提示词输入参数? 对于不同的任务类型(写作、做…...
OpenVSCode Server数据安全终极指南:完整备份与恢复策略
OpenVSCode Server数据安全终极指南:完整备份与恢复策略 【免费下载链接】openvscode-server 项目地址: https://gitcode.com/gh_mirrors/op/openvscode-server OpenVSCode Server是一款强大的云端代码编辑器,让开发者能够在浏览器中享受完整的V…...
从数据集到GUI应用:手把手教你用YOLOv11训练自己的手势识别模型(保姆级教程)
从数据集到GUI应用:手把手教你用YOLOv11训练自己的手势识别模型(保姆级教程) 在计算机视觉领域,手势识别技术正逐渐从实验室走向实际应用。无论是智能家居控制、虚拟现实交互,还是无障碍通信系统,准确快速的…...
从零开始:用STM32CubeMX+Keil5开发计算器的5个关键陷阱与解决方案
从零开始:用STM32CubeMXKeil5开发计算器的5个关键陷阱与解决方案 当你第一次尝试用STM32CubeMX和Keil5开发一个计算器时,可能会觉得这不过是几个简单数学运算的组合。但真正动手后,你会发现从工具链配置到算法实现,处处都是"…...
Base64隐写术逆向工程:从CTF题到自制解密工具(Python实现)
Base64隐写术逆向工程:从CTF题到自制解密工具(Python实现) 1. Base64编码原理与隐写空间 Base64编码的本质是将二进制数据转换为由64个可打印字符(A-Z、a-z、0-9、、/)组成的ASCII字符串。每个Base64字符对应6位二进制…...
别再手动组合特征了!用GBDT+LR搞定CTR预估,附Python实战代码与调参心得
GBDTLR:自动化特征工程的CTR预估实战指南 在推荐系统和广告投放领域,点击率(CTR)预估的准确性直接影响着平台的核心商业指标。传统手动特征工程方法在面对高维稀疏特征时往往力不从心,而GBDTLR的组合策略为我们提供了一…...
Ubuntu下基于simple-rtsp-server构建轻量级实时视频流媒体服务
1. 为什么选择simple-rtsp-server搭建流媒体服务 最近在给公司搭建内部监控系统时,我对比了市面上七八种RTSP服务器方案,最终选择了simple-rtsp-server。这个用纯C语言编写的轻量级服务器,编译后二进制文件只有几百KB,但性能却出乎…...
西门子触摸屏报警处理:除了弹窗,用这个‘非中断式’方法让产线更丝滑
西门子HMI非中断报警系统设计:让产线效率提升30%的实战方案 在快节奏的工业现场,每一次操作中断都意味着产能的隐形流失。传统HMI报警弹窗就像突然按下的暂停键——操作员必须停下手中任务去点击确认,而流水线上的产品仍在流动。这种矛盾在汽…...
C语言实现进程调度系统:优先级与时间片轮转
基于C语言的进程调度系统设计与实现1. 项目概述1.1 系统功能本系统实现了一个基于优先数调度和先来先服务算法的进程调度模拟器,主要功能包括:进程控制块(PCB)管理动态优先级调度时间片轮转执行进程状态跟踪文件操作模拟1.2 设计目标模拟操作系统进程调度…...
