一、背景
为什么要学习正则,因为需要过滤一些数据,并且判断当前数据是否符合预期,因此做一篇正则的
介绍与引入,当前网上有很多成熟的正则学习网站,因此此片文章只做参考
二、正则表达式元字符和特性
类别 | 字符 | 描述 |
---|---|---|
字符匹配 | 普通字符 | 例如 a 匹配 a |
元字符 | 例如\d匹配任意数字字符 \w匹配任意字母数字字符 .匹配任意字符(除了换行符) | |
量词 | * | 匹配前面的模式零次或多次 |
+ | 匹配前面的模式一次或多次 | |
? | 匹配前面的模式零次或一次 | |
{n} | 匹配前面的模式至少 n 次 | |
{n,m} | 匹配前面的模式至少 n 次且不超过 m 次 | |
字符类 | [ ] | 匹配括号内的任意一个字符。例如,[abc] 匹配字符 “a”、“b” 或 “c” |
[^ ] | 匹配除了括号内的字符以外的任意一个字符。例如,[^abc] 匹配除了字符 “a”、“b” 或 “c” 以外的任意字符 | |
边界匹配 | ^ | 匹配字符串的开头 |
$ | 匹配字符串的结尾 | |
\b | 匹配单词边界 | |
\B | 匹配非单词边界 | |
分组和捕获 | ( ) | 用于分组和捕获子表达式 |
(?: ) | 用于分组但不捕获子表达式 | |
特殊字符 | \ | 转义字符,用于匹配特殊字符本身 |
. | 匹配任意字符(除了换行符) | |
| | 用于指定多个模式的选择 |
三、常用到的正则匹配
1.字符簇
匹配某一组字符,例如字母的集合等,[[:alpha:]]匹配任何字母
字符 | 描述 |
---|---|
[[:alpha:]] | 任何字母 |
[[:digit:]] | 任何数字 |
[[:alnum:]] | 任何字母和数字 |
[[:upper:]] | 任何大写字母 |
[[:lower:]] | 任何小写字母 |
[[:punct:]] | 任何标点符号 |
[[:xdigit:]] | 任何16进制的数字,相当于[0-9a-fA-F] |
2.字符优先级
优先级高的先操作,例如()的优先级比|的优先级高,所以(ttt|333)|aaa,先做(ttt|333)的匹配再做|aaa的正则匹配
优先级 | 运算符 | 描述 |
---|---|---|
1 | \ | 转义符 |
2 | (), (?: ), (?=), [] | 圆括号和方括号 |
3 | *, +, ?, {n}, {n,}, {n,m} | 限定符 |
4 | ^, $, \任何元字符、任何字符 | 定位点和序列(即:位置和顺序) |
5 | | | 替换,“或"操作 字符具有高于替换运算符的优先级,使得"m|food"匹配"m"或"food”。若要匹配"mood"或"food",请使用括号创建子表达式,从而产生"(m|f)ood" |
3.特定正则的含义
一般规则,例如\d,小写\d写明正则匹配规则,大写\D写明非正则匹配规则
字符 | 描述 |
---|---|
\d | 匹配一个数字字符。等价于 [0-9] |
\D | 匹配一个非数字字符。等价于 [^0-9] |
\f | 匹配一个换页符。等价于 \x0c 和 \cL |
\n | 匹配一个换行符。等价于 \x0a 和 \cJ |
\r | 匹配一个回车符。等价于 \x0d 和 \cM |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v] |
\S | 任何16进制的数字,相当于[0-9a-fA-F] |
\t | 匹配一个制表符。等价于 \x09 和 \cI |
\v | 匹配一个垂直制表符。等价于 \x0b 和 \cK |
\w | 匹配字母、数字、下划线。等价于’[A-Za-z0-9_]’ |
\W | 匹配非字母、数字、下划线。等价于 ‘[^A-Za-z0-9_]’ |
\xn | 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,‘\x41’ 匹配 “A”。‘\x041’ 则等价于 ‘\x04’ & “1”。正则表达式中可以使用 ASCII 编码 |
\num | 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,‘(.)\1’ 匹配两个连续的相同字符 |
\n | 标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值 |
\nm | 标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm |
\nml | 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml |
\un | 匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?) |
四、常用例子
验证正则正确定的网址推荐: https://regex101.com (外网,需要VPN)