如果我的文章对您有帮助,麻烦回复一个赞,给我坚持下去的动力

效率提升之正则替换

【广告】微信小程序 - “两步动态验证”

  • 兼容谷歌验证码 :无缝支持Google Authenticator等标准TOTP验证器,通用各类平台账号
  • 云端加密备份 :密钥数据端到端加密上传云端,换机不丢失,安全又便捷
  • API快速集成 :提供开放API,轻松对接各类应用系统,实现自动化验证码获取
  • 多端共享:基于微信小程度,可同时在手机,PC端共同使用,一键复制
  • 扫描二维码试用,或微信小程序搜索“两步动态验证”

图片

效率提升之正则替换

引言:让文本处理不再是体力活

作为程序员,我们每天都在与代码、日志、配置文件打交道。有时候,面对成百上千行需要处理的文本,即便是最强壮的"复制粘贴大师"也会感到力不从心。
所以,今天我要分享一个在日常工作中经常用到的文本处理技巧——正则替换。

  • 你是否曾经为了从几百行日志中提取用户ID而一个个复制粘贴?
  • 你是否曾经因为需要将一堆数据转换成SQL语句而加班到深夜?
  • 你是否曾经面对重复的文本替换任务而感到人生无望?

如果你的答案是肯定的,那么恭喜你,今天这篇文章将是你的救星!正则替换不仅能解决这些问题,还能让你的工作效率提升到一个全新的高度。更重要的是,掌握这门技能后,你在同事眼中的形象将从"勤奋的码农"一跃成为"高效的魔法师"。

接下来,我将带你进入正则表达式的奇妙世界,从基础示例到语法技巧,一步步掌握这门让工作效率倍增的技能。

让我们先来看看正则替换可以帮我们做什么

场景一:从日志中提取关键数据

比如:你需要从一堆日志中提取所有用户ID。

原始日志

2024-01-15 10:30:25 INFO [user_45678] Login successful
2024-01-15 10:31:12 ERROR [user_12345] Database connection failed
2024-01-15 10:32:05 WARNING [user_78901] Session timeout

正则表达式.+user_(\d+).+

替换表达式$1

替换结果

45678
12345
78901

我们用\[user_(\d+)\]匹配[user_数字]格式的文本,并捕获其中的数字部分。替换时,我们只保留捕获到的数字$1,就这样轻松提取出了所有用户ID!

继续处理:现在我们需要将它们转换为SQL的IN语句参数。

原始数据

12345
67890
11223

正则表达式(\d+)\n?

替换表达式'$1',

替换结果

'12345','67890','11223',

然后你只需要手动去掉最后一个逗号,包裹在IN()中就完成了:

select * from user WHERE user_id IN ('12345','67890','11223')

另一种方式:同样是这个数据,如果我们想把它直接变为多条sql

原始数据

12345
67890
11223

正则表达式(\d+)

替换表达式select * from user where user_id = '$1';

替换结果

select * from user where user_id = '12345';
select * from user where user_id = '67890';
select * from user where user_id = '11223';

场景二:清理CSV数据中的多余空格

身经百战的你一定遇到过这样的文件——字段之间要么挤成一团,要么像被狗啃过一样到处是空格。这种"格式混乱症"不仅影响阅读,还会让你的数据导入工具崩溃给你看。

原始CSV数据

ID  ,  用户名  ,  部门     ,  入职日期
123,   张三  ,  技术部     , 2023-01-15  
456  ,李四,市场部,  2022-07-20
789   ,王五,  设计部  ,2021-11-10

有些逗号前有空格,有些逗号后有空格,有些两边都有空格。手动清理?别开玩笑了,几百行数据能让你清理到怀疑人生。

正则表达式\s*,\s*

  • \s*:匹配零个或多个空白字符(包括空格、制表符)
  • ,:匹配逗号本身
  • 组合起来就是:匹配任何前后带有零个或多个空格的逗号

替换为,(一个干净利落的逗号)

替换后的结果

ID,用户名,部门,入职日期
123,张三,技术部,2023-01-15
456,李四,市场部,2022-07-20
789,王五,设计部,2021-11-10

上面两个例子都是相对比较简单的场景,但是正则替换的强大之处在于它的灵活性和通用性。你可以根据实际需求,定制出各种复杂的匹配模式和替换规则。
下面我将介绍一些常用的正则表达式语法,帮助你快速上手。

正则表达式基础语法

如果把文本处理比作一场寻宝游戏,那么正则表达式就是你的寻宝地图。在正式开始寻宝之前,我们需要先学会看地图上的标记。

单个字符匹配:最基本的语法

正则表达式的最基本操作就是匹配单个字符。比如,如果你想在文本中找到所有的字母"a",直接使用a就可以了。

匹配模式:a
匹配结果:在文本中找到所有的字母"a"

但有时候,我们需要匹配一类字符,这时候就需要用到字符类(Character Classes)。

  • [abc]:匹配字母a、b或c中的任意一个
  • [0-9]:匹配任意一个数字(也可以简写为\d
  • [a-zA-Z]:匹配任意一个大小写字母

任意字符匹配:万能钥匙

如果你想匹配任何字符(除了换行符),可以使用.(点)。这是正则表达式中的万能钥匙

匹配模式:c.t
匹配结果:cat、cot、cut、c1t、c@t等(只要中间是任意单个字符)

开头和结尾:精准定位

有时候,我们需要确定匹配内容必须出现在文本的开头或结尾,这时候就需要用到锚点(Anchors)。

  • ^:匹配行的开头
  • $:匹配行的结尾
匹配模式:^hello
匹配结果:只有以"hello"开头的行才会被匹配

匹配模式:world$
匹配结果:只有以"world"结尾的行才会被匹配

匹配模式:^hello world$
匹配结果:只匹配整行内容就是"hello world"的行

数字和非空字符:特殊的类型

除了字符类,正则表达式还提供了一些特殊的简写来匹配常见的字符类型:

  • \d:匹配任意数字(等价于[0-9]
  • \D:匹配任意非数字字符(等价于[^0-9]
  • \w:匹配任意字母、数字或下划线(等价于[a-zA-Z0-9_]
  • \W:匹配任意非字母、数字、下划线的字符
  • \s:匹配任意空白字符(空格、制表符、换行符等)
  • \S:匹配任意非空白字符(也就是我们常说的"非空字符")
  • \n:匹配换行符

出现次数:数量不是问题

在正则表达式中,我们可以指定某个字符或组出现的次数,这让我们的匹配更加灵活。

-*:匹配前面的字符零次或多次("要多少有多少")
-+:匹配前面的字符一次或多次("至少要有一个")
-?:匹配前面的字符零次或一次("可有可无")
-{n}:匹配前面的字符恰好n次
-{n,}:匹配前面的字符至少n次
-{n,m}:匹配前面的字符至少n次,最多m次

使用括号()捕获数据

最神奇的部分来了!使用括号()可以捕获匹配到的数据,然后在替换时使用。这是正则替换中最核心、最强大的功能之一。

当你使用括号包围一部分正则表达式时,这部分匹配到的内容会被"捕获"并保存起来。你可以用$1$2$3等来引用这些捕获的内容,顺序与括号出现的顺序一致。

字符:1993-01-29
匹配模式:(\d{4})-(\d{2})-(\d{2})
捕获组:$1=1993,$2=01,$3=29

现在,你已经掌握了正则表达式的基本概念,但是仍然需要通过更多的实战才能熟练运用它!
回头看看前面的几个示例,是不是已经完全可以看懂了?

正则表达式虽然还有更多高级复杂的用法,但是你只需要掌握上面的部分就已经能处理日常工作中的大部分文本问题了
如果你想学习更多更高级的用法,可以阅读另一篇文章

正则表达式详解


如果你有任何问题,或者想分享你使用正则表达式的有趣经历,欢迎在评论区留言讨论!

QQ20251121-163914

posted @ 2025-11-21 16:48  无所事事O_o  阅读(4)  评论(0)    收藏  举报