黑马程序员技术交流社区

标题: 关于IP地址排序正则表达式转换的问题 [打印本页]

作者: wnmmp    时间: 2014-7-31 23:58
标题: 关于IP地址排序正则表达式转换的问题
本帖最后由 wnmmp 于 2014-8-1 00:24 编辑

                String ip = "10.10.10.10  192.168.1.200   3.3.3.3 127.0.0.108";
                ip = ip.replaceAll("(\\d+)", "00$1");
                ip = ip.replaceAll("0*(\\d{3})", "$1");
                String[] ips = ip.split(" +");
                Arrays.sort(ips);
                for(String x : ips){
                        System.out.println(x.replaceAll("0*(\\d+)", "$1"));
                }
如题,在将排完序的IP还原格式时用的正则表达式"0*(\\d+)",一直没想通,前面"0*"代表任意个0,后面"\\d+"代表一个或多个数字,那是不是有多个组合呢?比如前面代表1个0,后面代表2个0,或者前面代表2个0,后面代表1个0,但为什么"127.000.000.108"中的"000"没有转成"00",而是转成了"0"?


作者: icris    时间: 2014-8-1 00:09
* 是一个贪婪的符号,默认能匹配多少就匹配多少,能取 1 个也能取 2 个就会取 2 个
http://blog.csdn.net/lxcnn/article/details/4756030
作者: wnmmp    时间: 2014-8-1 18:24
好长的讲解,你就告诉我*和+哪个更贪婪?
作者: masai158    时间: 2014-8-1 19:21
   ip = ip.replaceAll("0*(\\d{3})", "$1");   我要先找到至少3个数字。然后前面还有0的话,那就不要了!!
*  0~N个
+ 1~N个。
作者: masai158    时间: 2014-8-1 19:54
本帖最后由 masai158 于 2014-8-1 19:55 编辑
masai158 发表于 2014-8-1 19:21
ip = ip.replaceAll("0*(\\d{3})", "$1");   我要先找到至少3个数字。然后前面还有0的话,那就不要了! ...

你自己不那样写的吗??? ("0*(\\d{3})   如 (3*(3+4))

作者: 江苏孙浩    时间: 2014-8-1 19:58
话说sort是怎么进行排序的?
作者: wnmmp    时间: 2014-8-1 20:07
masai158 发表于 2014-8-1 19:54
你自己不那样写的吗??? ("0*(\\d{3})   如 (3*(3+4))

我刚换了一下顺序,把0*(\\d+)换成了(\\d+)0*,其他都不变,结果127.000.000.108转换完后还是127.000.000.108,也就是说\\d+优先级比0*大,看来他们的优先抢夺0的能力跟前后顺序有关
作者: wnmmp    时间: 2014-8-1 20:11
江苏孙浩 发表于 2014-8-1 19:58
话说sort是怎么进行排序的?

public static void sort(Object[] a) {
        if (LegacyMergeSort.userRequested)
            legacyMergeSort(a);
        else
            ComparableTimSort.sort(a);
    }这是Arrays的源代码,好像最后用的是二进制排序
作者: icris    时间: 2014-8-1 20:11
wnmmp 发表于 2014-8-1 18:24
好长的讲解,你就告诉我*和+哪个更贪婪?

正则表达式里面,一般是哪个在前面,哪个更贪婪…
很多正则的东西都跟顺序有关,比如
"(?<==)(\\[.*\\]|[^,]*)"  原问题
括号里是两个用 | 连接的,但是反过来的话 \\[.*\\] 就不起作用了
作者: 江苏孙浩    时间: 2014-8-1 20:55
wnmmp 发表于 2014-8-1 20:11
public static void sort(Object[] a) {
        if (LegacyMergeSort.userRequested)
            legacy ...

忘记这是对String排序了:L 还以为是对int排序
作者: 江苏孙浩    时间: 2014-8-1 20:57
wnmmp 发表于 2014-8-1 20:07
我刚换了一下顺序,把0*(\\d+)换成了(\\d+)0*,其他都不变,结果127.000.000.108转换完后还是127.000.000 ...

0*(\\d+) 因为括号里的\\d+,所以最后必然要保留至少一个数字。然后0*意味着匹配尽可能多的数字,所以除去要保留的那个0,其他的都匹配了,毕竟这是贪心匹配,先到先得嘛
改变顺序后,0*最少匹配零个0,所以\\d+可以尽情匹配。
作者: wnmmp    时间: 2014-8-2 20:41
江苏孙浩 发表于 2014-8-1 20:57
0*(\\d+) 因为括号里的\\d+,所以最后必然要保留至少一个数字。然后0*意味着匹配尽可能多的数字,所以除去 ...

对的,话说sort也可以对int数组排序,源代码是快速排序法,我感觉跟课件讲的冒泡排序差不多,记住一个就行了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2