黑马程序员技术交流社区
标题:
关于正则表达式的小困惑
[打印本页]
作者:
dreamseekerkun
时间:
2014-8-24 00:47
标题:
关于正则表达式的小困惑
本帖最后由 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"));
}
}
作者:
icris
时间:
2014-8-24 12:48
正则表达式的括号不是用来改变顺序的,是用来捕获或断言的,在满足表达式的前提下,放在前面的比放在后面的贪婪,顺序跟括号没有关系。
这一句正则表达式是 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 。
作者:
优乐
时间:
2014-8-24 13:33
一直对正则表达式记不清!
作者:
dreamseekerkun
时间:
2014-8-24 15:29
icris 发表于 2014-8-24 12:48
正则表达式的括号不是用来改变顺序的,是用来捕获或断言的,在满足表达式的前提下,放在前面的比放在后面的 ...
非常感谢,你回答的非常仔细,请接受我的32个赞
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2