正则实战案例解析
案例1
需求
## 1. 输入内容
一些[@姓名]文本[@姓名/张小飞]你好@水果/水蜜桃
## 2. 输出内容
@姓名
@姓名/张小飞
@水果/水蜜桃
## 3. 处理规则
需要匹配出所有`@词典/词条`, 当没有词条时匹配出词典.
@后面表示词典
/后面表示词典
如果有 [ ] 号时, 则以它为界限。
## 4. 程序语言
JavaScript
实现1
@[^@\[\]\/\s]+\/?([^@\[\]\/\s]+)?
解析1
@[^@\[\]\/\s]+\/?([^@\[\]\/\s]+)?
@ 按字面匹配 字符 @,(区分大小写)
匹配不在下列列表中的一个单字符 [^@\[\]\/\s]+
+ 量词 — 匹配1到无穷次,尽可能多匹配,如果有必要,回溯匹配更少内容(贪婪)
@ 按字面匹配 字符 @,(区分大小写)
\[ 按字面匹配 字符 [,(区分大小写)
\] 按字面匹配 字符 ],(区分大小写)
\/ 按字面匹配 字符 /,(区分大小写)
\s 匹配空白符(等价于[\r\n\t\f\v ])
\/? 按字面匹配 字符 /,(区分大小写)
? 量词 — 匹配零个到1次,尽可能多匹配,如果有必要,回溯匹配更少内容(贪婪)
1st捕获组: ([^@\[\]\/\s]+)?
? 量词 — 匹配零个到1次,尽可能多匹配,如果有必要,回溯匹配更少内容(贪婪)
匹配不在下列列表中的一个单字符 [^@\[\]\/\s]+
+ 量词 — 匹配1到无穷次,尽可能多匹配,如果有必要,回溯匹配更少内容(贪婪)
@ 按字面匹配 字符 @,(区分大小写)
\[ 按字面匹配 字符 [,(区分大小写)
\] 按字面匹配 字符 ],(区分大小写)
\/ 按字面匹配 字符 /,(区分大小写)
\s 匹配空白符(等价于[\r\n\t\f\v ])
- 主体是分成两段式
- 其中
^@\[\]\/\s
表示匹配不在@[]/\s
这几个字符
案例2
需求
## 1. 输入内容
lg[((]([^(())]+)[))]
## 2. 输出内容
lg(W*10)
lg(W)
实现
lg[((]([^(())]+)[))]
解析
lg[((]([^(())]+)[))]
lg 按字面匹配 字符 lg,(区分大小写)
匹配下列列表中的一个单字符 [((]
(( 从列表 (( (区分大小写) 中匹配一个单字符
1st捕获组: ([^(())]+)
匹配不在下列列表中的一个单字符 [^(())]+
+ 量词 — 匹配1到无穷次,尽可能多匹配,如果有必要,回溯匹配更少内容(贪婪)
(()) 从列表 (()) (区分大小写) 中匹配一个单字符
匹配下列列表中的一个单字符 [))]
)) 从列表 )) (区分大小写) 中匹配一个单字符
- 需求中给出的括号是中文括号(
^(())
是剔除中文括号中再有的括号
案例3
需求
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-st4vu0Jl-1637232880355)(/Users/frankcooper/Library/Application Support/typora-user-images/image-20211118095406376.png)]
## 1. 输入内容
777TG
999AB
666DG
788YH
678GU
## 2. 输出内容
777TG
999AB
666DG
实现
^(\d)\1{2}[A-Z]{2}
解析
^(\d)\1{2}[A-Z]{2}
^ 断言此为一行的起始位置
1st捕获组: (\d)
\d 匹配一个数字字符(等价于[0-9])
\1{2} 匹配与捕获组1st最近匹配的相同的文本
{2} 量词 — 匹配2次
匹配下列列表中的一个单字符 [A-Z]{2}
{2} 量词 — 匹配2次
A-Z 单字符在A (index 65) 至 Z (index 90) 区间
- 需要注意的是
\1
这个用法,\1{2}
匹配与捕获组1st最近匹配的相同的文本 - 同理
^(\d)(\w)\2{2}[A-Z]{2}$
可以捕获到5sssYU
这种case
案例4
需求
实现
解析
案例
需求
实现