原文链接:https://kashima19960.github.io/2025/03/10/正则表达式快速入门/
前言
我写这篇文章,用来记录我平时使用正则表达式的方法,这样我在分享知识给大家的同时,也复习了一遍正则表达式。在你学习某个知识的时候,千万不要去像阅读手册一般去进行学习,因为手册的内容虽然非常详细且全面,但是其实你实际运用到的内容并不会很多,这个就是二八定律,正则表达式20%的内容,就足以够覆盖80%的使用场景了
什么是正则表达式
正则表达式的定义如下
正则表达式是一组由字母和符号组成的特殊文本, 它可以用来从文本中找出满足你想要的格式的句子.
首先,你难道不觉得 “正则表达式” 这个名字莫名奇妙,难以理解吗?正则表达式的英文原文是 “Regular expression”(简称 regex 或 regexp)) 其中把regular换一个翻译——规则的,有规律的,所以Regular expression的意思就是有规则的表达式。怎么样?是不是比啥正则表达式好懂多了。
正则表达式的作用
正则表达式的作用,用一句话概括就是——精确匹配,比如
- 文本搜索和替换
- 表单验证(如邮箱、手机号验证)
- 数据提取
- 字符串解析
当你注册一个网站,一般都会对你的密码强度进行验证,或者强制要求你必须满足某种“规则”,不然不让你通过注册
这个验证方法就是通过正则表达式实现的
练习平台
正则表达式是一种工具,所以学会工具的最好秘诀是要多练,这里我推荐两种练习的平台
在线
regex101: build, test, and debug regex
这个平台的使用很容易,上面是输入正则表达式,下面输出要匹配的字符串
离线
现在很多的编辑器基本都支持用正则表达式搜索文本,比如Vscode,你可以自己找找自己用的编辑器有没有这个功能
正则表达式常用知识
这里我只列举最常用的,当你学会这些常用的入门后,可以再去看看其他教程,学习一下更高级的用法
直接匹配
直接匹配其实就是普通的文本搜索,不使用任何正则表达式的语法
元字符
正则表达式是由各个元字符组合而成的,元字符跟他原本的含义没有什么关系,只是正则表达式的作者就这样定义的,所以不用去思考为啥这个元字符会是这个意思的问题,把常用元字符的含义记下来就行了
基本匹配元字符
符号 | 描述 |
---|---|
. | 匹配除换行符外的任意字符 |
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
\ | 当想要把元字符当作普通字符进行匹配,就需要用 \ 进行转义 |
.
是元字符中最简单的例子.
.
匹配任意单个字符, 但不匹配换行符.
例如,a.c
匹配 “abc”, “adc”, “a#c” 等
^
匹配字符串开头,$匹配字符串结尾
例如,^hello
匹配以 “hello” 开头的字符串,world$
匹配以 “world” 结尾的字符串
\
用来将元字符转义,当想要匹配的字符串是元字符时,就需要转义,否则会被当作正则表达式被识别
例如,\.
能够匹配字符串中的 .
而不是识别成元字符
数量限定符号
符号 | 描述 | 示例 |
---|---|---|
* | 匹配前面的表达式 0 次或多次 | a* 匹配 “”, “a”, “aa”, “aaa” 等 |
+ | 匹配前面的表达式 1 次或多次 | a+ 匹配 “a”, “aa”, “aaa” 等,但不匹配 “” |
? | 匹配前面的表达式 0 次或 1 次 | colou?r 匹配 “color” 或 “colour” |
{n} | 匹配前面的表达式恰好 n 次 | a{3} 只匹配 “aaa” |
{n,} | 匹配前面的表达式至少 n 次 | a{2,} 匹配 “aa”, “aaa” 等 |
{n,m} | 匹配前面的表达式 n 到 m 次 | a{2,4} 匹配 “aa”, “aaa”, "aaaa |
这里我说几个我平时很常用的做法
用 .*
,表示匹配任意字符0次或多次,说人话就是,单独使用会选中所有文本
然后呢,你可以用 .*
结合 ^ 和 $
,匹配特定字符串开头与特定字符串结尾的文本
比如用 ^hello.*world
匹配hello开头,world结尾的字符串
markdown引用图片的格式为 ![]()
,当你想删除一个markdown文件中的所有图片引用的时候,就可以使用 !\[.*
来匹配所有图片的引用
字符集和特殊字符
符号 | 描述 | 示例 |
---|---|---|
[abc] | 匹配方括号中的任意一个字符 | [abc] 匹配 “a”, “b” 或 “c” |
[^abc] | 匹配除方括号中字符外的任意字符 | [^abc] 匹配 “d”, “e” 等,但不匹配 “a”, “b”, “c” |
[a-z] | 匹配指定范围内的任意字符 | [a-z] 匹配任意小写字母 |
\d | 匹配数字,等价于 [0-9] | \d{3} 匹配三个数字 |
\w | 匹配字母、数字、下划线,等价于 [a-zA-Z0-9_] | \w+ 匹配一个或多个字母/数字/下划线 |
\s | 匹配空白字符(空格、制表符、换行等) | \s 匹配一个空格 |
\D | 匹配非数字字符 | \D+ 匹配一个或多个非数字字符 |
\W | 匹配非字母、数字、下划线的字符 | \W 匹配如 “#”, “@” 等符号 |
\S | 匹配非空白字符 | \S+ 匹配一个或多个非空白字符 |
特殊字符常用的就这几个,我教你怎么更容易记住
- \d的是digital,数字的意思,
- \w的是word,字词的意思
- \s的是space,按下空格键会输入空格符,所以\s匹配空格符
- 大写字母和小写字母互为反义词,\d匹配数字,那\D就用来匹配非数字
是不是很容易记,看着很多,其实都是有规律的
这里我介绍一下 |
,|
或运算符就表示或, 用作判断条件.,可以结合 []
一起使用,来实现敏感词过滤
fuck|shit|[傻煞沙][比笔逼叉缺吊碉雕]
结语
学会上面的这些,大多数的基础正则表达式,你基本都能看懂了,如果有些复杂的表达式有高级用法,等用到的时候再去看就行。以下是一些注意事项
- 在现实中,如果不是非常特定的需求,我都是建议直接在网上用别人写好的正则表达式,因为正则表达式是由元字符构成的,一旦很长,可读性极其差,比如
^(?!(.*?[A-Za-z0-9])\1{5,})(?=(?:.*?[A-Z]){2,})(?=(?:.*?[a-z]){2,})(?=(?:.*?[0-9]){2,})(?=.*?[!@#$%^&*()_+\-=\[\]{}|;':",.<>/?])(?!.*?(?:admin|root|password|123456|qwerty))(?!.*?(?:(.)\1{2,}))(?:[a-zA-Z0-9](?:[a-zA-Z0-9](?!-{2,}))*(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9](?!-{2,}))*)*\+?)?(?:[a-zA-Z0-9](?:[a-zA-Z0-9](?!-{2,}))*(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9](?!-{2,}))*)*)?@(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-zA-Z0-9-]*[a-zA-Z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$
- 让你学会正则表达式,最根本是让你能看懂,而不是让你能写出来,所以我都是建议你直接用ai写,然后根据ai给出的表达式对你特定的场景进行优化就行,等你看的多了,自然就能写出来了
这里我附上一些经典的参考资料
- 常用正则表达式大全
- 正则表达式30分钟入门教程 - deerchao - 博客园
- 简介 | 正则表达式30分钟入门教程