感觉Regex正则表达式是这样一种东西:
- 没有需求时去学习它:天啊这一串符号都是什么东西,怎么学啊!
- 当有需求用到它并且成功应用时:真是太方便了!真香,要学习!
动机
最近实习的时候,需要协助处理代码审查系统的告警,其中有大量(约1.6k)的命名风格的问题,需要对原有的变量命名进行批量替换。我用的编辑器是VS Code,它的朴素的字符串替换功能已经不能满足需求了,比如我需要做以下一些替换:
1
2
3
src0_32f -> vSrc0
dst0_32f -> vDst0
...
想到的是,用正则表达式匹配与替换,对于这个例子,所采用的方法是:
搜索框填:([a-z])(\w+)_32f
替换框填:v\U$1$2
真是方便!这促使我开启regex正则表达式的学习和积累。
基础
在处理字符串时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。
正则表达式的资料,网上已经有很多了,这里列举几个对我帮助比较大的:
-
正则表达式30分钟入门教程
- 中文,介绍正则表达式的一些基本概念。
-
Python RegEx

- 提供了各种regex的实例讲解。
- 本页以下内容主要基于此整理而成。
元字符(Metacharacters)
Regex的元字符有:[] . ^ $ * + ? {} | () \
-
[]:定义一个字符集合,当某一个单个字符属于该集合时,则匹配如规则
[abc]作用于apple会发生一次匹配-
可使用
-表示一个区间,如[0-9]等价于[0123456789],[a-z]等价于[abcd...xyz],[A-Z]等价于[ABCD...XYZ]-
[0-39]等价于[01239] -
[a-z0-9]等价于[abcd...xyz0123456789]
-
-
使用
^取集合的补集- 如
[^abc]代表所有不属于[abc]的字符集合
- 如
-
.:匹配除换行符\n之外的所有单个字符- 如规则
.作用于abcd时会发生4次匹配(分别为a,b,c,d);规则..作用于abcd时会发生2次匹配(分别为ab,cd);
- 如规则
-
^:判断以后续字符/串为开头的字符/串- 如规则
^ab作用于abc会发生匹配,作用于acb则不会发生匹配
- 如规则
-
$:判断以前缀字符/串为结尾的字符/串- 如规则
a$作用于formula会发生匹配,作用于cab则不会发生匹配
- 如规则
-
计数元字符:
*,+,?,{}-
*:其左方的单个字符重复大于等于0次- 如
ma*n可匹配mn,man,maaaaan
- 如
-
+:其左方的单个字符重复大于等于1次- 如
ma+n可匹配man,maaaaan
- 如
-
?:其左方的单个字符重复0次或1次- 如
ma?n可匹配mn,man
- 如
-
{}:{m, n}表示重复大于等于m次,小于等于n次- 比如
[0-9]{2, 4}匹配长度在2~4之间的数字串
- 比如
-
-
|:同or的含义,当某一个单个字符属于|连接的所有字符中的一个时,则发生匹配- 如规则
a|b作用于adb时,发生两次匹配(a和b) - 感觉有点像
[]啊
- 如规则
-
():分组-
一个
()扣起来的为一个组。当需要把匹配字符串中的某一小组提取出来,比较有用:-
比如要把
0000_32f替换为0000_32s,则可使用:-
搜索框填
([0-9]{4})_32f,替换框填$1_32s- 其中
$1就表示第一组的内容(regex从1开始计数)
- 其中
-
-
比如要把
0000_32f替换为0000_32F,则可使用:-
搜索框填
([0-9]{4})_32(\w),替换框填$1_32\U$2- 其中
\U表示将对应的字符转为大写
- 其中
-
-
-
-
\:常见的转移字符的含义
特殊字符
-
\d:等价于[0-9] -
\D:等价于[^0-9] -
\w:等价于[a-zA-Z0-9_](注意还可匹配下划线) -
\W:等价于[^a-zA-Z0-9_] -
\s:匹配一个空白位置
其他
- 在线测试正则表达式的工具:Wegester