java系列笔记---正则表达式(2)

2/10/2017来源:ASP.NET技巧人气:1253

正则表达式

      说真的正则表达式真不好写,当我收集资料准备开始写的时候,发现收集的东西越来越多范围也越来越广,我文章的前提就是文章要清晰,

在缕清自己思路之后,我从先简后难的方式来写有关正表达式,你们如果觉得这篇写的还可以的话,可以先关注我,接下来我会陆续更新。

  一.什么是正则表达式

      正则表达式(regular exPRessions)是一种描述字符串集的方法,它是以字符串集中各字符串的共有特征为依据的。

正则表达式可以用于搜索、编辑或者是操作文本和数据。这是官方表达听的有点绕口,用通俗的话来说就是:正则表达式主要用来处理和文本有关的内容

常见的处理方式有四种:1.匹配  2.切割   3.替换  4.获取    在下面我也会一一举例说明。

二.正则表达式常见的符号含义

    这个我在正则表达式(1)中,有关常用的也大概做个介绍,大家可以往前翻阅。

三.常见的处理方式有四种

(1)匹配   我这里使用的是字符串对象的方法  match(String regex),

复制代码
1 import java.util.regex.*;
2 public class TestException{
3       public static void main(String[] args) throws Exception {
4           String tel="18600000111";
5           String reg="1[3578]\\d{9}";  //首字母1,第二字母3,5,7,8,后面都是数字共有9位
6             boolean b1 =tel.matches(reg);
7         System.out.println(b1);//输出结果true
8       }
9 }
复制代码

(2)切割       我这里使用的是字符串中的split方法

案例一:切割一个或多个空格

复制代码
 1 //切割一个或者多个空格
 2 import java.util.regex.*;
 3 public class TestException{
 4       public static void main(String[] args) throws Exception {
 5           String str ="aaa bbb  ccc ddd    eee";
 6           String [] arr =str.split(" +");//“ +”表示至少有一个空格
 7           for(String s:arr){
 8               System.out.print(s);
 9           }
10       }
11 }
复制代码

运行结果;

aaabbbcccdddeee

案例二:通过.来切割字符串

复制代码
 1 //通过.来切割字符串
 2 import java.util.regex.*;
 3 public class TestException{
 4       public static void main(String[] args) {
 5           String str2="zhangsan.lisi.wangwu";
 6           /* \\是代表转义字符,如果你直接放split("."),是无法切割的,因为.在正则表达式中.有它特有的含义
 7              当你用转义之后\\.那么它就只代表一个点,而不具有特殊意义*/
 8           String [] arr2 =str2.split("\\.");
 9           for(String s:arr2){
10               System.out.println(s);
11           }
12       }
13 }
14 /* 补充:在java中需要转义的除了.外,还有需要先转义不能直接切割的:
15  *     $  ( )  *  +  [ ]   ?    \  ^  { }  |  
16  *     这么几个大家用它来切割的时候,转义后就可以了
17  */
复制代码

运行结果:

zhangsan
lisi
wangwu

案例三:用重复项来切割

复制代码
 1 //用重复项来切割
 2 import java.util.regex.*;
 3 public class TestException{
 4       public static void main(String[] args) {
 5           String str3 ="wer#######tayuio****asdfg";
 6           String reg ="(..)"; //(.)代表第一个任意字符    \\1代表回去第一组数据  +代表1个或者多个      
 7           String [] arr3=str3.split(reg);
 8           for(String s:arr3){
 9               System.out.println(s);
10           }
11       }
12 }
13 /* 补充:我怕初学者对"(.)\\1+",还没有搞懂,我这里在单独解释一下:(.)的字符视为一个整体。 \\1代表回去第一组数据
14  * 那它其实在这里也就代表(.),所以就相当于(.)(.)+,这里仅仅是相当于,也是为了好理解,其实他们还是有本质区别的
15  * 因为(.)==\\1,就是说如果.代表a,那么\\1也就代表a,而(.)≠(.),前面代表a后面可以代表b,因为前后两个点不是同一个点
16  * 我也不知道这样比较是否恰当, 反正意思就是这个意思
17  */
复制代码

运行结果:

wer
tayuio
asdfg

(3)替换  使用String字符串汇总的方法

案例一:把重复的数据 替换为#

复制代码
 1 //把重复的数据 替换为#
 2 import java.util.regex.*;
 3 public class TestException{
 4       public static void main(String[] args) {
 5           String str="wer#####yw****fghj"; 
 6           //把重复的数据 替换为#    
 7           str=str.replaceAll("(.)\\1+", "#");//(.) 第一个任意字符   \\1 取第一组数据   +  1个或者多个
 8           System.out.println(str) ; 
 9           }
10    }
复制代码

运行结果:

wer#yw#fghj

案列二:把重复项都变成单个

复制代码
1 import java.util.regex.*;
2 public class TestException{
3       public static void main(String[] args) {
4           String str="wer#####yw****fg???hj"; 
5     //后一个参数的含义 可以通过$  数字引用第一个参数中的组,这个美元符号代表就是前面小括号里的内容
6               str=str.replaceAll("(.)\\1+", "$1");
7               System.out.println(str); 
8           }
9    }
复制代码

运行结果:

wer#yw*fg?hj

案例三:电话号码中间几位用*表示

复制代码
1 import java.util.regex.*;
2 public class TestException{
3       public static void main(String[] args) {
4           String str2="15889895644";//158****5644  
5           str2=str2.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
6           System.out.println(str2);// $1表示符号前面第一个小括号,$2代表第二个,如果有第三个小括号,那也可以$3; 
7           }
8    }
复制代码

运行结果:

158****5644

(4)获取    字符串中没有直接提供该功能 只能通过正则表达匹配

案例一:获取正则表达式所匹配的字符串

复制代码
 1 import java.util.regex.*;
 2 public class TestException{
 3       public static void main(String[] args) {
 4           String str="da jio zhu yi laa, ming tian  fang jia laa";
 5           //1.定义规则
 6           String reg="\\b[a-z]{3}\\b";//任意三个字符 \\b 是单词的边界(明白为什么加这个)
 7           Pattern p =Pattern.compile(reg);
 8           //3.通过正则表达对象 获取匹配器对象   并把操作的字符串关联
 9           Matcher m =p.matcher(str);
10           while(m.find()){  //find()用来搜索与正则表达式相匹配的任何目标字符串
11           System.out.println(m.start()+"....."+m.group()+"..."+m.end());
12           } //start()开始位置    group()用来返回包含了所匹配文本的字符串     end()结束位置
13           }
14    }
15 /* 有关: 在regex(正则表达式)包中,包括了两个类,Pattern(模式类)和Matcher(匹配器类)。
16  * 这个大家也可以多去了解
17  */
复制代码

运行结果:

3.....jio...6
7.....zhu...10
14.....laa...17
35.....jia...38
39.....laa...42

四:最后来一个综合小案例

题目1:10.10.10.10   192.168.118.40  192.168.1.200  127.0.0.108   按照升序排序

复制代码
 1 import java.util.Arrays;
 2 import java.util.regex.*;
 3 public class TestException{
 4       public static void main(String[] args) {
 5           String ip="10.10.10.10  192.168.118.40  192.168.1.200  127.0.0.108";
 6           /*
 7            * 为了方便   每一个端都补零 保证每一个字段至少是三位
 8            */
 9           ip=ip.replaceAll("(\\d+)", "00$1");//补0,让至少有三位数
10           
11           ip=ip.replaceAll("0*(\\d{3})", "$1");//所有都变成三位数
12           
13           String [] ips =ip.split(" +");//用空格来切割
14           Arrays.sort(ips);//升序排序          
15           for(String x:ips){
16               System.out.println(x.replaceAll("0*(\\d+)", "$1"));//还原
17           }
18    }
19 }
20 /** 这个题目或许看着不难,难就难在思维模式,它这每一步都很关键,也是希望大家在学习的途中多思考,而不是停留在看的基础上
21  */
复制代码

运行结果:

10.10.10.10
127.0.0.108
192.168.1.200
192.168.118.40

这篇文章到这里结束了,接下来对于正则表达式我还会再写,比如Pattern(模式类)和Matcher(匹配器类),再比如如何获取文本中的电话号码等等深入的一些东西,不过最近应该不写了,

接下来我会写一些其它有关的知识。

大家看完也欢迎做出点评,哪里写的不周到或者还可以更好的也欢迎提出,我会立即更正,谢谢!