新闻详情

新闻详情

首页 / 资讯中心 / 详情

正则 flags 弄明白:g、i、m、s 到底改了什么,还有两个性能坑

发布时间:2026/9/28 21:07:13来源:尧图网络
正则 flags 弄明白:g、i、m、s 到底改了什么,还有两个性能坑
写正则这么多年我发现最坑人的往往不是正则本身写错了而是 flags 没配对。同一个正则换一个 flag行为天差地别偏偏很多人根本不看这玩意。这篇把 g、i、m、s 四个最常用的 flag 讲清楚再补两个性能上的坑。我自己栽过写出来免得你再栽一遍。先说这四个 flag 各自干嘛g全局不加它正则匹配到第一个就停了你只能拿到一个结果。加了才返回所有非重叠匹配。想提取所有邮箱“统计某个词出现几次”不开 g 你永远只有一条。i忽略大小写让字母匹配不分大小写。想同时把Error和error都抓出来开 i 就完事。m多行让^和$从整个字符串的头尾变成每一行的头尾。逐行处理日志的时候不开这个^匹配不到每行开头。s单行默认.是不匹配换行符的开了 s 之后.连换行也吃适合跨行匹配。这四个可以自由组合。我见过最多的翻车就是处理多行日志忘了加 m结果^死活匹配不到每一行或者想提取全部匹配忘了加 g只拿到第一条还以为正则有 bug。举个具体例子。一段日志Error: timeoutinfo: startError: retry你想统计有几个 Error写/Error/不加 g引擎只返回第一个你数出来是 1实际上有俩。加了g才是 2。贪婪匹配是结果不对的头号原因量词*、默认是贪婪的能多吃就多吃。比如想提取引号里的内容写.*它从第一个引号一路吃到最后一个引号中间全给你吞了。改成.*?非贪婪量词后面加个?它就少吃点碰到第一个引号就停。这个坑在有多对定界符的文本里特别容易中招很多人在这里卡一下午。性能坑一灾难性回溯这个是真正要命的。正则引擎回溯起来复杂度能到指数级。经典例子(a)$拿去匹配aaaaaaaaaaaaaaaaaaaaab前面 20 个 a 后面一个 b永远匹配不上但引擎会疯狂回溯把 CPU 吃满界面直接卡死。原理不复杂a本身能匹配任意多个 a外面再套个就产生了几何级数的分组方式引擎每种都要试一遍最后 b 匹配不上才死心。字符串越长回溯次数越吓人。怎么写才不中招两条别用嵌套量词像(a)这种。用明确的字符类替代.*能精确就精确比如\d别写成.*。还有一条很多语言的正则引擎比如 JavaScript 的 V8用的是回溯型引擎天然怕这个而像 RE2 那种用自动机的引擎就没这毛病但 JS 里没得选只能自己注意写法。性能坑二别在循环里重复编译这个偏代码层面但经常被忽略。正则对象如果每次循环都 new 一遍会反复编译白白浪费。应该在循环外面编译好循环里只做匹配。Python 里用re.compileJava 里预编译 Pattern都是一个道理。最后说下我的调试习惯正则很多问题是全局性的——贪婪、回溯、边界、flags 组合。这些拿一个实时高亮、能同时放多组样本的工具来看比在代码里打断点直观得多。我的流程是先在星点这个在线测试器里把正则和样本验明白确认该中的中、不该中的不中再落到代码里最后用单测兜底。调试正则功夫一大半花在看清楚它在匹配什么上。把 flags 配对、把贪婪和非贪婪搞清楚再避开回溯的坑基本就顺了。工具链接https://www.xingdian.net/app/regex/tester/
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

差分运放设计避坑指南:从原理到实战的快速计算方法 2026/9/28 21:59:42

差分运放设计避坑指南:从原理到实战的快速计算方法

差分运放这个东西,刚入行的硬件工程师十有八九都在它身上栽过跟头。我第一次独立设计差分放大电路的时候,信心满满地按教科书上的公式算好了电阻值,板子打回来一测,输出直接偏到电源轨上去了。后来查了半天才发现,是基…

阅读更多 →
TJA1043 INH引脚:AUTOSAR休眠失效的关键硬件开关 2026/9/28 21:59:42

TJA1043 INH引脚:AUTOSAR休眠失效的关键硬件开关

1. 为什么TJA1043的INH脚会成为整车下电失败的“隐形开关”我第一次在某款新能源SUV项目上遇到CAN网络无法正常休眠的问题时,整整花了三天时间排查。现象很典型:整车钥匙拔出后,VCU(整车控制器)和BMS(电池管…

阅读更多 →
C# WinForms与OPC协议实现PLC数据采集及SQL报表系统 2026/9/28 21:59:42

C# WinForms与OPC协议实现PLC数据采集及SQL报表系统

简介:一套基于C# WinForms的OPC数据采集报表项目,面向工业自动化领域的.NET开发者,尤其适合需要对接OPC DA服务、采集实时数据并生成报表的工程师学习。项目以源码和SQL文件为核心,完整覆盖OPC客户端通信、MySQL数据库交互、WinFo…

阅读更多 →
ax调度:微服务任务编排与资源控制的实践解析 2026/9/28 21:59:35

ax调度:微服务任务编排与资源控制的实践解析

“ax”这个代号,最早是我在内部项目里随手起的,结果叫着叫着就改不过来了。说白了,ax就是一个我自己写的调度引擎,解决的是微服务体系里最烦的那类问题:几百个定时任务、事件触发任务、人工补偿任务混在一起&#xff0…

阅读更多 →
一阶IIR滤波器实战:差分方程系数计算与嵌入式C语言实现 2026/9/28 21:59:07

一阶IIR滤波器实战:差分方程系数计算与嵌入式C语言实现

1. 一阶IIR滤波器到底在做什么1.1 从一个生活场景说起你拿手机录一段语音,回放的时候发现底噪很大,嘶嘶的声音让人难受。你想把它弄干净,但又不想花太多计算资源。这时候一阶IIR滤波器就是最顺手的那把刀。它的核心逻辑特别朴素:当…

阅读更多 →
从ROS迁移到M-Robots OS:无人机编队系统实战与5大优势解析 2026/9/28 21:59:07

从ROS迁移到M-Robots OS:无人机编队系统实战与5大优势解析

1. 从一次炸机说起:为什么我要把编队系统从ROS搬到M-Robots OS去年秋天,我带着三架自组的450轴距无人机在郊外做密集编队测试。飞控跑的是PX4,机载计算机是树莓派4B,上层编队逻辑用ROS Noetic搭的。前两组动作还算稳,到…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉