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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© dreamseekerkun 中级黑马   /  2014-8-24 00:47  /  1432 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 dreamseekerkun 于 2014-8-24 15:42 编辑

192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30
        将ip地址进行地址段顺序的排序。
        还按照字符串自然顺序,只要让它们每一段都是3位即可。
        1,按照每一段需要的最多的0进行补齐,那么每一段就会至少保证有3位。
        2,将每一段只保留3位。这样,所有的ip地址都是每一段3位。

        */
        public static void ipSort()
        {
                String ip = "192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30";

                ip = ip.replaceAll("(\\d+)","00$1");
                System.out.println(ip);

                ip = ip.replaceAll("0*(\\d{3})","$1");//这一块没转过弯来,是怎么运行的,第一遍替换完后,比如1就变成了001,是先运行( )里面的吗,然后前面的0*后运行么
                System.out.println(ip);

                String[] arr = ip.split(" ");

                TreeSet<String> ts = new TreeSet<String>();

                for(String s : arr)
                {
                        ts.add(s);
                }

                for(String s : ts)
                {
                        System.out.println(s.replaceAll("0*(\\d+)","$1"));
                }
        }

评分

参与人数 1技术分 +1 收起 理由
格子、 + 1 淡定

查看全部评分

3 个回复

倒序浏览
正则表达式的括号不是用来改变顺序的,是用来捕获或断言的,在满足表达式的前提下,放在前面的比放在后面的贪婪,顺序跟括号没有关系。
这一句正则表达式是 0*\\d{3} ,对于 00192 来说,满足这一个表达式的有 192、019、001 三个,而由于 * 是贪婪的,所以只会匹配 00192 ,其中 192 被括号捕获,后面用 $1 表示,整个的意思是把 00192 替换成 192 。对于 001 ,一共只有三个数,\\d{3} 捕获到了,0* 匹配0个0 ,替换结果 001 。
再如后面一句 s.replaceAll("0*(\\d+)","$1") ,对于 001 前后有多重匹配方式, 0-01、-001、00-1 ,由于 * 在前面,只会按照 00-1 匹配,替换结果就是 1 。

评分

参与人数 1技术分 +1 收起 理由
格子、 + 1 很给力!

查看全部评分

回复 使用道具 举报
一直对正则表达式记不清!
回复 使用道具 举报
icris 发表于 2014-8-24 12:48
正则表达式的括号不是用来改变顺序的,是用来捕获或断言的,在满足表达式的前提下,放在前面的比放在后面的 ...

非常感谢,你回答的非常仔细,请接受我的32个赞
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马