示例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)"