正则表达式

正则表达式 知识量:10 - 22 - 55

7.2 子表达式的嵌套><

使用子表达式嵌套- 7.2.1 -

上一节匹配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]))

结果:

MatchPositionLength
10.236.111.20513

以上正则表达式成功的排除了非法的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]))

最后,总结一下分析复杂表达式的方法:

  • 分解表达式,每次只分析和理解一个子表达式。

  • 分析的顺序应当是按照先内后外的顺序,切不可从前往后一个字符一个字符的分析。