正则表达式入门(二)分支条件、分组

发表于2019-11-02,长度698, 37个单词, 1分钟读完
Flag Counter

回顾前文的问题:匹配几种格式的电话号码,像(010)88886666,或022-22334455,或02912345678等,该怎么写?可以使用前面我们分析的(?0\d{2}[)-]?\d{8}吗?

实际不可以:(?0\d{2}[)-]?\d{8}会匹配到一些不合法的电话号码,比如010)12345678或(022-87654321。

也就是我们要求前面有括号才能后面有括号,那怎么办?通过元字符好像解决不了这个问题,我们可以使用“分支条件”:用竖线(在主键区最右边,回车键上面)把不同的规则分隔开。

比如

0\d{2}-\d{8}|0\d{3}-\d{7}

匹配两种以连字号分隔的电话号码,

\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}

匹配3位区号的电话号码。


接下来思考这个问题:如何匹配匹配IP4地址,比如192.168.110.001?

IP地址就是四组三位数(也可能是一位或两位),中间用点连接。我们可以写成\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}。

但是如果有一种字符串是一万组(又来…),我们想使用次数范围怎么办?这时候可以使用前面提到的分组:把需要重复出现的用小括号包围起来。 比如上面的正则可以改成(\d{1,3}.){3}\d{1,3}。

实际上,上面的正则式并非IPv4的正确表达,因为这个式子可以匹配诸如999.888.777.666这样的字符串

复杂但合法的IP正则是

((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)

既使用了分支也使用了分组。看能看懂吗。

Written on November 2, 2019
分类: dev, 标签: re
如果你喜欢,请赞赏! davelet