• 已解决 33355 个问题
  • 已帮助 5761 位优秀工程师

正则表达式的贪婪模式怎么理解

9604a3b72d92b876 2019-12-10 浏览量:247

最近在用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。

这和我理解贪婪模式始终获取最长匹配的概念是有冲突的,暂时还没在其它语言里面尝试,不知道是否也是如此。

哪位高手能帮忙再讲解一下贪婪模式的实现机制?

综合应用 其他应用
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 这个和贪婪模式没有关系,你的子匹配或语法有问题,应该把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)

    • 发布于 2019-12-11
    • 举报
    • 评论 2
    • 0
    • 0
9604a3b72d92b876 回复了 xdsnet:你的完整规则和我的没有本质区别哦,我只是用了{3}重复3遍,另外和贪婪模式的确是有关系的,在非贪婪(懒惰)模式下,match值会选择最短匹配。我现在的疑问是“|”并不是常规意义上的“或”,而是在执行顺序上是有讲究的。 回复
xdsnet 回复了 xdsnet:就是或的意思,就是匹配到了就不测试后面的啦,而且这个确实不是贪婪模式的问题,你没有注意我安排的哪些内容的顺序 回复

其他答案 数量:0
正则表达式的贪婪模式怎么理解