介绍
正则表达式表示的是一个 规则,判断一个字符串是否 符合规则
很多开发语言中都支持 正则表达式
类比
相当于文件夹的搜索*.java,表示匹配文件名是.java的文件,如下:
应用场景
校验
在网站注册、app注册时,需要填 email、手机号等,此时需要做格式验证
比如验证手机号,如果自己做校验,需要进行以下操作:
- 判断第一个数字是1
- 判断第二个数字不能01249
- 判断长度是11位
- 判断都是数字
代码复杂,编写代码比较长
解决:正则表达式
查找字符串
从一个 大文本 中,查找出 复杂 的字符串,使用 String 的 index() 方法很难处理
替换字符串
校验 弹幕、评论 是否包含 敏感词,如果包含就将 敏感词 替换成 * 或 小可爱 或 你自定义的词
拆分字符串
可进行 较复杂 的拆分,如:根据一些符号拆分,或根据 4位年份拆分 等
在线正则测试
https://tool.oschina.net/regex/?optionGlobl=global
校验 弹幕、评论 是否包含敏感词,如果包含就替换成 * 或 小可爱,如下:
正则表达式语法
元字符
x:匹配 x,也可以是其他字母
.:所有任意一个字符,包括 字母、数字、符号、汉字。除了 \n,
\d 匹配任意一个数字,相当于 [0-9]\D 非数字,相当于 [^0-9]
\w 匹配一个字母 或 数字 或 _,相当于 [0-9a-zA-Z_]。不包含汉字、符号\W 匹配一个 不是 字母 或 数字 或 _ 的字符,相当于 [^0-9a-zA-Z_]
\s 不可见字符,如:空格,制表符\S 非不可见字符
范围
[abc]:匹配字母 a 或 b 或 c
[^abc]: 中括号 [] 中,第一个符号是 ^ ,表示否定,匹配 除了 a 或 b 或 c 以外,任意一个字符
[-]:- 在 [] 中,表示 连字符。如:[a-z] 表示匹配 a-z 中的任意一个字符
XZ 匹配 X 后直接跟着 Z
x|y 匹配 x 或 y。例如,'z|food' 匹配"z"或"food"。'(z|f)ood' 匹配"zood"或"food"。
位置
^ 匹配字符串的开始。与 [^] 中的含义不同
$ 匹配字符串的结束
\b 匹配字符串的结束
表示匹配次数的符号
匹配次数的符号,要跟在 正则表达式的 后面,表示匹配的次数
* 0次或多次 匹配前面的字符或子表达式。例如,zo* 匹配"z"和"zoo"。* 等效于 {0,}。
+ 1次或多次 匹配前面的字符或子表达式。例如,"zo+"与"zo"和"zoo"匹配,但与"z"不匹配。+ 等效于 {1,}。
? 0次或1次 匹配前面的字符或子表达式。例如,"do(es)?"匹配"do"或"does"中的"do"。? 等效于 {0,1}。
{n} n 是非负整数。匹配 n 次。例如,"o{2}"与"Bob"中的"o"不匹配,但与"food"中的两个"o"匹配。
{n,} n 是非负整数。至少匹配 n 次。例如,"o{2,}"不匹配"Bob"中的"o",而匹配"foooood"中的所有 o。"o{1,}"等效于"o+"。"o{0,}"等效于"o*"。
{n,m} m 和 n 是非负整数,其中 n <= m。匹配至少 n 次,至多 m 次。例如,"o{1,3}"匹配"fooooood"中的头三个 o。'o{0,1}' 等效于 'o?'。注意:您不能将空格插入逗号和数字之间。
() 内的内容表示的是一个表达式,()本身不匹配任何东西,也不惜那是匹配任何东西,只是把括号内的内容作为
同一个表达式来处理,例如(ab){1,3},就表示ab一起连续出现最少1次,最多三次。如果没有括号的话,ab{1,3},
就表示a 后面紧跟的b出现的最少一次,最多三次。另外,括号在匹配模式中也跟重要
其他
符号 除了 _ 以外,匹配符号前面要加 \
\ 反斜杠,需要转译\\
\n:匹配换行\t:匹配制表符,tab 键\.:匹配 .\r:匹配回车,一般不用
案例-校验出生年份
常用出生年份:
2025
2010
2003
1998
1985
1974
1965
1953
1949
1936
1928
1917
1904
出生年份规则
- 第一个数字:1或2
- 第二个数字:0或9
- 第三个数字:0-9
- 第四个数字:0-9
正则表达式写法一
[1-2][0|9][0-9][0-9]
正则表达式写法二
功能同写法一
[1-2][0|9][0-9]{2}
写法一和二的bug
正则表达式写法三
能避免上面的bug,表示从头到尾完全匹配
^[1-2][0|9][0-9]{2}$
缺点:无法从字符串中提取出4位年
案例-校验邮箱
分析邮件名称部分:
- 26个大小写英文字母表示为
a-zA-Z - 数字表示为
0-9 - 下划线表示为
_ - 中划线表示为
- - 由于名称是由若干个字母、数字、下划线和中划线组成,所以需要用到
+表示多次出现
根据以上条件得出邮件名称表达式:[a-zA-Z0-9_-]+
分析域名部分:
比如 qq.com、163.com
综上所述,域名部分可以表示为 [a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+
最终表达式:
^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$
参考:
https://www.runoob.com/java/java-regular-expressions.html
https://blog.csdn.net/qq_42363090/article/details/105770949



