拓展:正则表达式
一、什么是正则表达式
正则表达式(regular expression,常简写为regex、regexp或re),是一种用于匹配和操作文本的强大工具,它是由一系列字符和特殊字符组成的模式,用于描述要匹配的文本模式。正则表达式可以在文本中查找、替换、提取和验证特定的模式。
二、正则表达式的语法组件
1、字符类
| 字符 | 描述 |
|---|---|
| . | 匹配除 r,n 之外的任何单个字符。要匹配包括 r,n 在内的任何字符,请使用像 (.|r|n) 的模式。 |
| d | 匹配一个数字字符。等价于[0-9]。 |
| D | 匹配一个非数字字符。等价于 [^0-9]。 |
| w | 匹配包括下划线的任何单词字符。等价于 [A-Za-z0-9_],注意Unicode正则表达式会匹配中文字符。 |
| W | 匹配任何非单词字符。等价于 [^A-Za-z0-9_]。 |
| s | 匹配任何空白字符,包括空格、制表符、换页符等。等价于[ fnrtv]。 |
| S | 匹配任何非空白字符。等价于 [^ fnrtv]。 |
| [xyz] | 匹配所包含的任意一个字符。如 [abc] 可以匹配“plain”中的“a”。特殊字符仅有反斜线 保持特殊含义,用于转义字符。其它特殊字符如星号、加号、各种括号等均作为普通字符。脱字符 ^ 如果出现在首位则表示负值字符集合;如果出现在字符串中间就仅作为普通字符。连字符 – 如果出现在字符串中间表示字符范围描述;如果出现在首位(或末尾)则仅作为普通字符。右方括号应转义出现,也可以作为首位字符出现。 |
| [^xyz] | 匹配未列出的任意字符。 |
| [a-z] | 字符范围。匹配在Unicode编码表指定范围内的任意字符。 例如,[a-z]可以匹配“a”到“z”范围内的任意小写字母字符。 |
2、数量词
| 字符 | 描述 |
|---|---|
| ***** | 匹配前面的子表达式零次或多次。等价于 {0,}。 |
| + | 匹配前面的子表达式一次或多次。等价于 {1,}。 |
| ? | 匹配前面的子表达式零次或一次。等价于 {0,1}。 |
| {n} | n是一个非负整数。匹配确定的n次。例如, o{2} 不能匹配“Bob”中的“o”,但是能匹配“food”中的两个“o”。 |
| {n,} | 至少匹配n次。 |
| {n,m} | 其中n<=m。最少匹配n次且最多匹配m次。 |
| ? | 非贪心量化:当该字符紧跟在任何一个其他重复修饰符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如对于字符串“oooo”,o+? 将匹配单个“o”,而 o+ 将匹配所有“o”。 |
3、边界匹配器
| 字符 | 描述 |
|---|---|
| ^ | 匹配字符串的开始位置。 |
| $ | 匹配字符串的结束位置。 |
| b | 匹配一个单词边界,也就是指单词和空格间的位置。 |
| B | 匹配非单词边界。 |
4、逻辑运算符
XY:X 后跟 Y
X|Y:X 或 Y
5、捕获组
| 字符 | 描述 |
|---|---|
| (pattern) | 匹配 pattern 并获取这一匹配的子字符串。 |
| (?P | 与常规的圆括号类似,但分组所匹配到了子字符串可通过符号分组名称 name 来访问。 |
| (?P=name) | 引用一个命名组合。 |
| num | 向后引用一个子字符串,该子字符串与正则表达式的第num个用括号围起来的子表达式匹配。其中num从1开始。例如:(.)1 匹配两个连续的相同字符。 |
6、非捕获组
(?:X) :X,作为非捕获组
(?=X) :X,通过零宽度的正 lookahead
(?<=X) :X,通过零宽度的正 lookbehind
(?!X) :X,通过零宽度的负 lookahead
(?<!X) :X,通过零宽度的负 lookbehind
三、常见案例
1. 数字(整数):^[0-9]+$ 或 ^d+$
2. 正整数:^[1-9]d*$
3. 负整数:^-[1-9]d*$
4. 整数:^-?d+$
5. 正负整数:^[+-]?d+$
6. 浮点数:^-?d+.d+$
7. 正浮点数:^[1-9]d*.d+|0.d+[1-9]d*$
8. 中文字符:^[u4e00-u9fa5]+$
9. 英文字母:^[A-Za-z]+$
10. 字母和数字:^[A-Za-z0-9]+$
11. 用户名(字母开头,5-16位):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
12. 密码(至少8位,含大小写字母和数字):^(?=.*[a-z])(?=.*[A-Z])(?=.*d)[a-zA-Zd]{8,}$
13. 手机号(中国大陆):^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])d{8}$
14. 邮箱地址:^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$
15. 身份证号(18位):^d{17}[dXx]$
16. 邮政编码:^[1-9]d{5}$
17. URL链接:^(https?|ftp)://[^s/$.?#].[^s]*$
18. IP地址:^((25[0-5]|2[0-4]d|[01]?dd?).){3}(25[0-5]|2[0-4]d|[01]?dd?)$
19. 域名:^[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$
20. 日期(YYYY-MM-DD):^d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]d|3[01])$
21. 时间(24小时制):^([01]d|2[0-3]):[0-5]d(:[0-5]d)?$
22. 中国大陆车牌号:^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼][A-Z][A-Z0-9]{4,5}[A-Z0-9挂学警港澳]$
23. 删除HTML标签:<[^>]+>
24. 匹配空白行:ns*r
25. 匹配首尾空白字符:^s*|s*$
26. QQ号码:[1-9][0-9]{4,}
27. 提取颜色十六进制值:#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})
28. 匹配图片文件名:.(gif|png|jpg|jpeg|bmp|webp)$
29. 匹配中文、英文、数字及下划线:^[u4e00-u9fa5A-Za-z0-9_]+$
30. 匹配双字节字符(包括汉字):[^x00-xff]
31. 金额(两位小数):^d+(.d{1,2})?$
32. 微信号:^[a-zA-Z][-_a-zA-Z0-9]{5,19}$
33. 匹配特定扩展名:.(doc|docx|xls|xlsx|ppt|pptx|pdf)$
34. 删除行尾注释(如//注释)://.*$
35. 匹配URL中的参数:(?|&)([^=]+)=([^&]+)
36.0-255之间的数字:^([1-9]?d|1d{2}|2[0-4]d|25[0-5])$