1. 分组
- 正则里用
()
表示分组
1.1 分组匹配
示例:ab+
与 (ab)+
ab+
受+限定的就只有b
(ab)+,此时(ab)成为一个整体,由量词+来限定
1.2 分组匹配2
- 非贪婪模式:量词 +
?
正则 \d{15}\d{3}?
d{3} 表示三次,加问号非贪婪还是 3 次
正则 \d{15}(\d{3})?
在 \d{3} 整体后加问号,表示后面三位可有可无
![](https://img.haomeiwen.com/i20154612/690bc2c3a588f445.png)
2. 多选结构
格式:(…|…)
,在括号内以竖线 | 分隔开多个子表达式,这些子表达式也叫多选分支 (option)
2.1 没有括号的多选结构
^ab|cd$
表示“字符串开头的ab或者字符串结尾的cd”
因为竖线 | 的优先级很低,所以 ^ab|cd$
其实是 (^ab|cd$)
,而不是 ^(ab|cd)$
2.2 匹配身份证
从1999年10月1日起,全国实行公民身份证号码制度,居民身份证编号由原15位升至18位
正则表达式 [1-9]\d{13,16}[0-9x]
首位是数字(0除外)
中间都是数字
末位是数字或x (15位末位没有x)
描述 | 正则 |
---|---|
15位身份证号 | [1-9]\d{14} |
18位身份证号 | [1-9]\d{14}\d{2}[0-9x] |
正则表达式 | [1-9]\d{14}(\d{2}[0-9x])? |
正则 - 多选结构 | ^([1-9]\d{14}|[1-9]\d{14}\d{2}[0-9x])$ |
2.3 匹配IP地址
- IP 地址
(0~255).(0~255).(0~255).(0~255)
匹配一段数值在0~255之间的文本,正则 ([0-9]|[0-9]{2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])
情况分析 | 正则 |
---|---|
如果是 1 位数,则对数字无限制 | [0-9] |
如果是 2 位数,则对数字无限制 | [0-9]{2} |
如果是 3 位数 | |
若第 1 位数字是 1,则第 2、3 位数字无限制 | 1[0-9][0-9] |
若第 1 位数字是 2 | |
第 2 位数字是 0~4,则第 3 位数字无限制 | 2[0-4][0-9] |
第 2 位数字是 5,则第 3 位数字只能是 0~5 | 25[0-5] |
3. 捕获分组
-
()
分组捕获 - 分组编号只取决于开括号出现的顺序
- group(num), num表示对应括号的编号,括号分组的编号规则是从左向右计数,从 1 开始
3.1 分组
(\d{3})-(\d{5})
分组提取数据,\d{3}-\d{5}
只是匹配
(.mp4|.avi|.wmv)
匹配多个,[Uu] 匹配单个字符
3.2 分组回溯引用
- 引用分组捕获的文本,不仅仅用于数据提取,也可以用于替换
- 分组引用的编号用
\number
表示,比如,\1
匹配第一个分组,以此类推
示例一:
![](https://img.haomeiwen.com/i20154612/6f80702d489319af.png)
示例二:
![](https://img.haomeiwen.com/i20154612/8fb292d9362e8cef.png)
正则 ((a)b)(c)\1
![](https://img.haomeiwen.com/i20154612/4a97726dec1bb52a.png)
正则 ((a)b)(c)\3
,按左括号出现的顺序编号,\3
匹配 c
![](https://img.haomeiwen.com/i20154612/3caaae9a7041ae8f.png)
3.3 匹配重复数据
示例一:正则 (\w{2,})\1
![](https://img.haomeiwen.com/i20154612/541c9f9a38413a1d.png)
示例二:连续重复单词的匹配
![](https://img.haomeiwen.com/i20154612/f5810c922746b0d6.png)
![](https://img.haomeiwen.com/i20154612/32027295815605c0.png)
3.4 分组引用替换
- 分组 一个括号是一组,可以把指定的组暂时先缓存起来 $1
# 数据:3334444-55555
regex: (\d{3})(\d{4})(-)
# $1 表示第一个表达式
replace: ($1) $2
# 结果:(333) 444455555
![](https://img.haomeiwen.com/i20154612/aa4027b43b5a9c7a.png)
4. 非捕获分组
-
(?:express)
非分组捕获,括号只用于归组,把某个部分当成“单个元素”,不分配编号,后面不会再进行这部分的引用 -
?:express
匹配但不获取结果
示例一:((?:a)b)(c)\1
![](https://img.haomeiwen.com/i20154612/747fd7347ecfa752.png)
示例二:(?:(a)b)(c)\1
![](https://img.haomeiwen.com/i20154612/26ef7884090ccd74.png)
示例三:(?:(?:a)b)(c)\1
![](https://img.haomeiwen.com/i20154612/a97cdf5500c11dcb.png)
网友评论