正则表达式的经典案例

默认情况下,量词要匹配能够使整个匹配能够成功的最大可能的重复次数。若要修改这种行为,可以使用后缀‘?’,或使用后缀‘+’(贪婪匹配,即使整个匹配失败,也要让这部分匹配次数最多)。

对四个ip地址进行排序。

	public static void regex_test() {
		String  ip="127.0.0.0  3.12.1.10  128.13.31.0  125.8.0.101";
		ip=ip.replaceAll("(\\d+)","00$1");
		ip=ip.replaceAll("0+(\\d{3})", "$1");
		String []so=ip.split("\\s");
		TreeSetts=new TreeSet();
		for(String s:so)
		{
			ts.add(s);
		}
		for(String s:ts)
		{
		  //	System.out.println(s);
		  System.out.println(s.replaceAll("0*(\\d+)","$1"));
		  //System.out.println(s.replaceAll("0+([0-9]+\\.)","$1").replaceAll("\\.0+([0-9]+)", "\\.$1"));
		}
	}
 总共分三步,第一步,把每位数字前加两个0。

 第二步,每个数字调整到三位。

 第三步,排序,并在输出时,将每个数字前面多余的0删去。

第三步稍微难些,有两种办法,第一种:替换两次,第一次把前面的0,数字和数字后的点,三者进行匹配,替换成数字和数字后的点。但发现最后一个数字后面没点,即匹配失败,于是乎,再把前面的点,前面的0和数字三者进行匹配,替换成点和数字。

第二种(推荐):每个数字都有三位,数字(前面有0个0或多个0)和(一个数字或多个数字),两者进行匹配,替换成(一个数字或多个数字)。(一开始以为101,这样处理后,会变为11,后来发现101整体都被匹配,这个优先级高,而不是把01进行匹配,换为1。)

注意:第二种方法不可修改为:System.out.println(s.replaceAll("0+(\\d+)","$1"));这样的话101由于开头不为0,所以不被整体匹配,但是,01却被部分匹配,以至于变为11。


你可能感兴趣的:(java)