A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wnmmp 中级黑马   /  2014-7-31 23:58  /  1671 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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"?

13 个回复

倒序浏览
* 是一个贪婪的符号,默认能匹配多少就匹配多少,能取 1 个也能取 2 个就会取 2 个
http://blog.csdn.net/lxcnn/article/details/4756030

点评

这个网页里面的太长了,你都看懂了吗?帮我讲一下跟这道题有关的撒!谢谢  发表于 2014-8-1 19:53
回复 使用道具 举报
wnmmp 来自手机 中级黑马 2014-8-1 18:24:34
藤椅
好长的讲解,你就告诉我*和+哪个更贪婪?
回复 使用道具 举报
   ip = ip.replaceAll("0*(\\d{3})", "$1");   我要先找到至少3个数字。然后前面还有0的话,那就不要了!!
*  0~N个
+ 1~N个。

点评

你的意思是0*比\\d{3}优先级高?可以在满足后者最少数字(即3)之后抢夺其他所有的0?  发表于 2014-8-1 19:51
回复 使用道具 举报
本帖最后由 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))
回复 使用道具 举报
话说sort是怎么进行排序的?
回复 使用道具 举报
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的能力跟前后顺序有关
回复 使用道具 举报
江苏孙浩 发表于 2014-8-1 19:58
话说sort是怎么进行排序的?

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

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

忘记这是对String排序了:L 还以为是对int排序
回复 使用道具 举报
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+可以尽情匹配。
回复 使用道具 举报 1 0
江苏孙浩 发表于 2014-8-1 20:57
0*(\\d+) 因为括号里的\\d+,所以最后必然要保留至少一个数字。然后0*意味着匹配尽可能多的数字,所以除去 ...

对的,话说sort也可以对int数组排序,源代码是快速排序法,我感觉跟课件讲的冒泡排序差不多,记住一个就行了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马