最近在用java做一个程序,其中有一段用于读取txt文件中的ip地址的代码:
String ipPattern="((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(1\\d\\d|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)"; Pattern p=Pattern.compile(ipPattern); Matcher m=p.matcher(txtLine);调用m.group()正常获取ip地址,但是如果当pattern设置为:"((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])"的时候
获取的地址最后一个就只取一位数字,例如字符串s111.123.34.23t,那么截取出来的是111.123.34.2,而不是期望的111.123.34.23。
这和我理解贪婪模式始终获取最长匹配的概念是有冲突的,暂时还没在其它语言里面尝试,不知道是否也是如此。
哪位高手能帮忙再讲解一下贪婪模式的实现机制?
这个和贪婪模式没有关系,你的子匹配或语法有问题,应该把25、2[0-4]放前面,都没匹配到才去或,你现在的语法一开始就或到一位数字啦。
贪婪模式要在有不定匹配(*或者+来描述)或者范围匹配时({nm}来描述,且m>n)才起作用的,你的描述中就没有的。
比较完整的匹配IPv4的IP地址规则式是 (25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)