正则表达式入门(3)

示例3

匹配IP地址

ip地址格式由4个0-255之间的数字中间"."隔开

"\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}"

这样貌似是可行,但是有个问题,这样可以匹配256-999之间的值,是不合法的

稍微改一下

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

1-255的正则如下

"25[0-5]|2[0-4]\\d|[01]?\\d\\d?"

250-255比较特殊,个位只能取0-5,所以正则是"25[0-5]"

然后是200-249 得到 "2[0-4]\\d"

最后是0-199 百位是0,1 可以写成"[01]",当然百位的0也可以不写 "[01]?"

加上个位和百位得到 "[01]?\\d\\d?",拼起来,就完成了

 

这么写可以匹配IP地址,但也会把类似723.81.1.2000这样的字符串匹配出来 得到23.81.1.200,不过好像不是我们想要的,可能根本就不是一个ip

再次修改,得到表达式 "(?<!\\d)(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3}(?!\\d)"

可以看到变动,在前面加了"(?<!\\d)"后面加了"(?!\\d)",

这是一个 环视(lookaround)

"(?<!\\d)"的含义是 左边不能是数字

"(?!\\d)"则是右边不能是数字

环视一共有4种类型

?<={表达式}    左侧必须匹配{表达式}

?<!{表达式}     左侧不能匹配{表达式}

?={表达式}      右侧必须匹配{表达式}

?!{表达式}       右侧不能匹配{表达式}

 

环视本身不会匹配任何字符

上面的例子,如果把规则改为 匹配  ip:{ip} 这样的形式,但是只要取出ip

那只要改成

"(?<=ip:)(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)(\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3}(?!\\d)"

posted on 2014-01-20 02:33  viago  阅读(198)  评论(0编辑  收藏  举报