感觉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