1、介绍
文本模式匹配工具,可以匹配普通字符、特殊字符等
查找、替换、验证、提取文本
格式:/pattern/flags
pattern:模式。各种符号和元字符等组成
/:包围正则表达式的模式
flags:修饰符。控制匹配方式
2、模式
2.1、元字符
\d
匹配数字
\D
匹配非数字
\w
(小写w)匹配字母、数字和下划线,相当于[a-zA-Z0-9_]
\W
(大写W) 匹配非字母、数字和下划线外的字符,相当于[^a-zA-Z0-9_]
\s
(小写s)匹配空白字符,包括空格、制表符\t
、换行符\n
,回车\r
换页\f
垂直制表符\v
等
\S
(大写S)匹配非空白字符,包括空格、制表符、换行符等
2.2、量词
+
前面字符至少出现(1次或多次)
*
前面字符0次或1次或多次
?
前面字符最多出现1次(0次或1次)
{n}
匹配n次
{n,}
前面字符至少出现n次
{n,m}
前面字符至少出现n次,至多出现m次
*
+
贪婪模式,尽可能多的匹配字符
?
非贪婪模式,最小匹配
如*?
,+?
,{n}?
,{n,}?
,{n,m}?
2.3. 特殊字符
.
匹配除换行符外的任意单个字符
\
转义字符
|
管道,多个表达式中任意一个,表示“或”关系
2.4、字符类
[]
字符集合中任一字符。例如,[A-Z]
匹配所有大写字母
[^]
不在字符集合中的任意一个字符
-
连接符,在字符集中表示范围,如,[a-z]
任意小写字母
中括号中包含连接符
[-] :反斜杠转义连接符
[-a],[a-] 连接符放在开始或结尾
2.5、定位符
边界匹配
$
字符串结尾
^
匹配字符串的开始
\b
匹配单词的边界
\B
非单词边界
定位符与限定符(即量词)不可紧靠使用,如
^*
无效
2.6、分组和捕获
( )
分组 和捕获子表达式
(? )
分组但不捕获子表达式
断言:
引申1: 反向预查?=
、?<=
、?!
、?<!
exp1(?=exp2) 查找exp2前面的exp1
(?<=exp2)exp1 查找exp2后面的exp1
exp1(?!exp2) 查找后面不是exp2的exp1
(?<!exp2)exp1 查找前面不是exp2的exp1
引申2:正向预查?:
同(),但(?:exp)
不获取匹配结果
反向预查和正向预查,可消除()的缓存(分组副作用:缓存)
预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符后开始(不太理解)
重命名(?<name>)
分组捕获的值,赋值给name
2.7、反向引用
\num
(其中num为具体数字,如1,2,3)
用来引用前面捕获组()
中匹配的内容;其中num表示第num个匹配的引用
如,\b(\w+)\b\s+\1\b
-
\b(\w+)\b
捕获一个单词 -
\s+\1
匹配与捕获到的第一个单词一致的内容
“\数字” 反向引用的展示
3、修饰符
-
i
不区分大小写 -
g
全局匹配,即匹配所有而非仅匹配第一个 -
m
多行匹配,即^和$匹配字符串中每一行的开头和结尾 -
s
单行模式:.可匹配换行符在内的所有字符 -
u
Unicode模式 -
y
粘性模式:从目标字符串的当前位置开始匹配。类似^
,但是针对的是匹配的起始位置 -
x
扩展模式:忽略模式中的空白和注释(Python中re.VERBOSE
)
如:gi :全局匹配+忽略大小写,如email
ims 忽略大小写+多行模式+点号匹配换行符(日志分析)
gu 全局匹配+Unicode(Unicode表情符号)
4、优先级
从左到右进行计算
-
\
:转义符 -
()
,(?:)
,(?=)
,[]
:圆括号和方括号 -
*
,+
,?
,{n}
,{n,}
,{n,m}
:量词(限定符) -
^
,$
,\d
等元字符,任何字符 :定位点和序列 -
|
管道
5、实例
5.1 匹配邮箱 :用户名@域名
用户名:字母、数字、下划线、点号、百分号、加号和减号
/\b[\w.%+-]+@[\w.-]+\.[a-zA-Z]{2,6}\b/g
\.
转义字符匹配.;否则匹配除换行外的任一字符
更严谨^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$
5.2 匹配URL
^(https?|ftp):\/\/[^\s/$.?#].[^\s]*
^(https?|ftp)
:匹配以http,https或ftp开头的协议部分
[^\s/$.?#]
:除空格、斜杠、文化、点号、井号之外的字符,表示主机名部分
5.3 密码强度校验
.*(?=.{8,20})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*])
8-20位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符
-
(?=.*\d)
必须包含至少1个数字 -
(?=.*[A-Z])
必须包含至少1个大写字母 -
(?=.*[a-z])
必须包含至少1个小写字母 -
(?=.*[!@#$%^&*])
必须包含至少1个特殊字符(特殊字符范围:!@#$%^&*
)
AI优化:
^(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*?_])[a-zA_Z\d!@#$%^&*?_]{8,20}$
-
^
$
添加锚点,确保开头和结尾匹配,避免部分匹配导致的安全漏洞。如Aa1@qwertyuiopasdfghjk
(之前校验通过,但是实际错误,因长度=21) - 独立断言条件
(?=)
- 主模式限制:
[a-zA_Z\d!@#$%^&*?_]{8,20}
4.4 其他
- 中文字符:[\u4e00-\u9fa5]
- 空白行:\n\s*\r
6、参考
6.1、正则表达式 – 简介 | 菜鸟教程
6.2、正则表达式在线测试 | 菜鸟工具
6.3、正则表达式语法,正则表达式速查表-在线工具箱