正则表达式

介绍

正则表达式表示的是一个 规则,判断一个字符串是否 符合规则

很多开发语言中都支持 正则表达式

类比

相当于文件夹的搜索*.java,表示匹配文件名是.java的文件,如下:

应用场景

校验

在网站注册、app注册时,需要填 email、手机号等,此时需要做格式验证

比如验证手机号,如果自己做校验,需要进行以下操作:

  1. 判断第一个数字是1
  2. 判断第二个数字不能01249
  3. 判断长度是11位
  4. 判断都是数字

代码复杂,编写代码比较长

解决:正则表达式

查找字符串

从一个 大文本 中,查找出 复杂 的字符串,使用 String 的 index() 方法很难处理

替换字符串

校验 弹幕、评论 是否包含 敏感词,如果包含就将 敏感词 替换成 * 或 小可爱 或 你自定义的词

拆分字符串

可进行 较复杂 的拆分,如:根据一些符号拆分,或根据 4位年份拆分 等

在线正则测试

http://tool.chinaz.com/regex

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位年

案例-校验邮箱

举例:abcde@163.com

分析邮件名称部分:

  • 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


原文出处:/show_1IX2yvsAZgmZ.html