正则表达式 知识量:10 - 22 - 55
上一节匹配IP地址的正则表达式并不是完全正确的,因为IP地址每组数值的取值范围是有规定的,即每组都是0~255之间。要定义正确的正则表达式需要进行更加细致复杂的修改,必须使用子表达式的嵌套。
子表达式嵌套就是一个子表达式位于另一个子表达式内,嵌套可以是多重的,即可以嵌套许多层。考虑到性能问题,嵌套还是能少则少,能解决问题即可。
修改匹配IP地址的正则表达式,可以先列出合法的IP地址构成分类,以下IP地址的各组数字都是合法的:
任何一个1位或2位数字。
任何一个以1开头的3位数字。
任何一个以2开头、第2位数字在0~4之间的3位数字。
任何一个以25开头、第3位数字在0~5之间的3位数字。
示例文本:
ping 10.236.111.20 ping 121.266.25.1
正则表达式:
(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3} ((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))
结果:
Match | Position | Length |
---|---|---|
10.236.111.20 | 5 | 13 |
以上正则表达式成功的排除了非法的IP地址:121.266.25.1。
解析一下这个看上去如此复杂的正则表达式:
1、定义每一种可能的数字组成。
任何一个1位或2位数字:\d{1,2}
任何一个以1开头的3位数字:1\d{2}
任何一个以2开头、第2位数字在0~4之间的3位数字:2[0-4]\d
任何一个以25开头、第3位数字在0~5之间的3位数字:25[0-5]
2、规定每一种数字组成之一会匹配。
(\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5])
3、为每一种数字组成添加后面的“.”。
((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.
4、定义每组出现3次。
(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}
5、加上最后一组数字,完成表达式。(最后一组数字后面可没“.”)
(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}
((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))
最后,总结一下分析复杂表达式的方法:
分解表达式,每次只分析和理解一个子表达式。
分析的顺序应当是按照先内后外的顺序,切不可从前往后一个字符一个字符的分析。
Copyright © 2017-Now pnotes.cn. All Rights Reserved.
编程学习笔记 保留所有权利
MARK:3.0.0.20240214.P35
From 2017.2.6