Java正则表达式 实例

文件内容丢失

来解释一下这个(.)\\1+正则表达还是的意思,

  • (.):捕获一个任意字符
  • \1反向引用,表示前面捕获的字符
  • +表示前面的字符出现1此或多次
    这句话的意思就是,匹配两个或者两个以上的重复的字符

然后$1表示第一个捕获组中的内容,也就是捕获到的这个字符。
所以temp.replaceAll("(.)\\1+", "$1");这句话的意思就是,把temp字符串中两个或者两个以上的重复字符替换成该字符本身,换句话说就是删除所有重复到的字符。

对IP地址进行排序

原文:https://blog.csdn.net/sinat_36713319/article/details/53463120

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public static void sortIPAddress()
{
String temp = "192.168.1.200 10.10.10.10 10.10.10.11 11.10.10.10 3.3.50.3 127.0.0.1";
// 对所有的数字全部都在前面补上两个0
temp = temp.replaceAll("(\\d+)", "00$1");
System.out.println("ip地址:-->"+temp);
// 因为ip地址占3位(\d{3})捕获后三位,
// 把多余的0删除掉
temp = temp.replaceAll("0+(\\d{3})", "$1");// 将ip地址补成同样位数
System.out.println("ip地址:-->"+temp);
// 用空格割
String[] str = temp.split(" +");
// 排序从大到小排序
Arrays.sort(str);
System.out.println("从小到大排序:");
for (String string : str)
{
System.out.println(string);
}
System.out.println("去掉加上的辅助0");
for (String ips : str)
//删除多余的0
System.out.println(ips.replaceAll("0+(\\d+)", "$1"));
}

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ip地址:-->00192.00168.001.00200 0010.0010.0010.0010 0010.0010.0010.0011 0011.0010.0010.0010 003.003.0050.003 00127.000.000.001
ip地址:-->192.168.001.200 010.010.010.010 010.010.010.011 011.010.010.010 003.003.050.003 127.000.000.001
从小到大排序:
003.003.050.003
010.010.010.010
010.010.010.011
011.010.010.010
127.000.000.001
192.168.001.200
去掉加上的辅助0
3.3.50.3
10.10.10.10
10.10.10.11
11.10.10.10
127.0.0.1
192.168.1.20

  • 首先来看temp.replaceAll("(\\d+)", "00$1");这句,(\\d+)将捕获到ip地址中除了点号之外的所有数字串,因为ip地址每一位可以是1位数,2位数,3位数,这里先不管使用00$1进行替换,这样每一位就是3位数到5位数。
  • temp.replaceAll("0+(\\d{3})", "$1");这句,首先\d{3}表示正好匹配3位数,0+一个或者多个00+(\\d{3})这个表达式的意思就是,匹配多个0开头,然后后面正好有3位数,把这3位数捕获出来,temp.replaceAll("0+(\\d{3})", "$1");这句话的意思就是捕获最后的3位数,然后用这3位数,替换掉原来的3到5位的数
  • 经过上面两步之后,所有的ip地址都会变成3位数表示的,不足的前面会补0,这样转换的好处就是可以方便的使用Array.sort()方法对这些字符串进行排序。
  • 注意排序后的字符,都是我们高位补0后的ip地址这与平时的ip地址表示方式不同所以,要把高位的0去掉。
  • ips.replaceAll("0+(\\d+)", "$1")这句话实现去掉高位的0,高位的0不会被捕获到,高位的0不包含在捕获组$1,这样在进行替换的时候就等于删除了高位的0

小结

**使用替换进行删除或添加元素,就是拿出来又放回去**,如果少放了就相当于删除一部分了,如果多方了就是新增了一部分。

  • 替换删除,以少换多:我们匹配较多的字符,然后只捕获其中较少的一部分,再用捕获到的少量字符替换匹配的较多的字符,这样就等同于删除掉那些没有捕获的部分。这就好比从果篮里拿出几个水果,例如拿出苹果和香蕉,然后我再把苹果放回去,香蕉丢掉。这样果篮里的香蕉就没有了,相当于被删除掉了。
  • 替换添加,以多换少:我么匹配较少的字符,并且捕获这些字符,然后捕获到的字符加上一些新的字符替换回去。这样等效于添加了字符。例如我现在只拿出雪梨,然后我变出一个芒果,然后雪梨和芒果一起放回果篮里,这样果篮里就多出了一个芒果,而雪梨还是原来的雪梨。