黑马程序员--java基础之正则表达式

正则表达式:

1、概念:符合一定规则的表达式,用于操作字符串;

      虽然String类中有很多方法来操作字符串,但是每个方法操作的内容太简单,如果需要对字符串进行复杂操作,需要组合简单代码,造成代码太复杂。所以操作字符串最简单的方法是正则表达式,先通过一个实例来对比。

需求如下:对QQ号码进行校验,要求5-15位,0不能开头,而且只能是数字。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import java.util.*;
class RegularExpressions
{
    public static void main(String [] args){
        System.out.println(0x0b);
        //checkQQ_01("115708873");普通方法
        //checkQQ_02("115708873");正则表达式
    }
         
    //方法一:该方法利用正则表达式判断,简单很多
    public static void checkQQ_02(String qq){
        //定义规则
        String regex = "[1-9][0-9]{4,14}";
        //调用matches方法返回boolean
        boolean flag = qq.matches(regex);
        if(flag)
            System.out.println("QQ号为:" + qq);
        else
            System.out.println("号码不合法");
    }
         
    //方法二:该方法是用字符串的简单方法进行组合来判断是否合法
    public static void checkQQ_01(String qq){      
        int len = qq.length();
        //先判定长度,长度符合则继续判断
        if(len>=5 && len<=15){           
            //判断开头是否为0,不为0继续判断
            if(!(qq.startsWith("0")))
            {
                /*该注释部分是用基本的方法判断,下面有另一种比较简化的方法
                /先将字符串变成字符数组
                char [] chr = qq.toCharArray();
                //定义一个标签
                boolean flag = true;
                //对数组进行遍历
                for (int i=0; i<chr.length ;i++ )
                {
                    //如果发现字符不符合,将标签改为false,并退出
                    if(!(chr[i]> '0' && chr[i]<='9'))
                    {
                        flag = false;
                        break;
                    }
                }
                //符合就执行if,不符合就执行else
                if(flag)               
                    System.out.println("QQ号为:" + qq);              
                else               
                    System.out.println("非法字符,请重新输入");*/
                         
                     
                //下面是另一种方法,将字符串变为长整型,自动判断
                try
                {
                    long l = Long.parseLong(qq);
                    System.out.println("QQ号为:" + l);
                }
                //异常处理
                catch (NumberFormatException e)
                {
                    System.out.println("非法字符,请重新输入");
                }          
            }  
            else
            {
                System.out.println("0不能开头");
            }  
        }
        else
            System.out.println("长度不符合");   
    }
}

2、功能特点:用一些特定的符号来表示一些代码操作,简化书写。详细内容见java.util.regex.Pattern。

       1) 匹配:String matches(regex)方法

           练习一:需求:校验手机号码,13***,15***,18***

1
2
3
4
5
6
7
8
class RegularExpressions
{
    public static void main(String [] args){
        String tel = "13552326980";
        String regex = "1[358]\\d{9}";
        System.out.println(tel.matches(regex));
    }
}

        2)切割:String split(regex)方法

           练习二:需求:用正则表达式切割

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class RegularExpressions
{
    public static void main(String [] args){
        //一、切割带多空格的字符串     
        splitDemo("zhangsan   lisi     wangwu" , " +");
        //二、切割带.的字符串。注意:.在正则表达式中代表任意字符,直接用.会返回0,无意义。
        //所以必须加\代表普通符号,但是作为字符串前面必须有转义字符,所以再加一个\
        splitDemo("zhangsan.lisi.wangwu" , "\\.");
        //三、切割盘符.注意:单独将\\作为切割符需要在每个\前加\来进行转义,所以共4个\
        splitDemo("C:\\abc\\bcd.txt" , "\\\\");
        //四、切割叠词前后的字符串.
        //注意:第一位是任意字符,用.表示,而(.)表示.被封装成组,可以被后面继续使用,\1表示调用第一组,再加转义\,+表示出现多次
        splitDemo("klaadgggaddddgj" , "(.)\\1+");
    }
    public static void splitDemo(String str , String regex){
        String [] arr = str.split(regex);
        System.out.println(arr.length);
        for(String s : arr){
            System.out.println(s);
        }
    }
}

        3)替换:String replaceAll(regex,str)方法

           练习三:替换字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class RegularExpressions
{
    public static void main(String [] args){
        //一、将字符串中连续超过5个的数字替换成“#”
        replaceDemo("adfa23124566757asdfadf2012", "#", "\\d{5,}");
        //二、将字符串中的叠词替换成"#"
        replaceDemo("addfaaasdfadffff23d", "#", "(.)\\1+");
        //三、将字符串中的叠词变成一个.注意:$符号代表获取组中的内容,数字表示获取第几组
        replaceDemo("addfaaasdfadffff23d", "$1", "(.)\\1+");
    }
    public static void replaceDemo(String str1, String str2, String regex){
        String str = str1.replaceAll(regex,str2);
        System.out.println(str);
    }
}

        4)获取:将字符串中符合规则的子串取出

          练习四:将字符串"ming tian jiu yao fang jia le"中含有3个或4个字符的子串取出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.util.regex.*;
class RegularExpressions
{
    public static void main(String [] args){
        String str = "ming tian jiu yao fang jia le";
        //定义规则,\b表示单词边界
        String regex = "\\b[a-z]{4}\\b";
        //获取Pattern对象,用compile方法,将规则传入
        Pattern p = Pattern.compile(regex);
        //获取匹配器,用matcher方法,将字符串传入
        Matcher m = p.matcher(str);
        //循环匹配,用匹配器的find方法
        while(m.find()){
            //获取匹配结果并打印,用匹配器的group方法
            System.out.println(m.group());
        }
    }
}

3、综合练习  

    练习五:需求:将下列字符串变成"我要学编程"

1
2
3
4
5
6
7
8
9
10
11
12
import java.util.regex.*;
class RegularExpressions
{
    public static void main(String [] args){
        String str = "我我...我我我..我要....要要...要要...学学学...学学...编编编....程.程程..程程程..程...程";
          
        str = str.replaceAll("\\.+","");
          
        str = str.replaceAll("(.)\\1+","$1");
        System.out.println(str);
    }
}

    练习六:需求:将下列IP地址排序 192.168.0.1  10.123.43.9  100.101.3.15 38.38.38.38

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.util.regex.*;
import java.util.*;
class RegularExpressions
{
    public static void main(String [] args){
        String str = "192.168.0.100  10.123.43.9   192.168.0.1  100.101.3.15   38.38.38.38";
        //先在每位上补2个0
        str = str.replaceAll("(\\d+)","00$1");
        //再保留3位数字
        str = str.replaceAll("0*(\\d{3})","$1");
        System.out.println(str);
        //切割到数组
        String [] arr = str.split(" +");
        //对数组排序,或者将数组遍历后逐一添加到集合中,然后再读取集合
        Arrays.sort(arr);
        //打印数组
        for (String s : arr)
        {
            System.out.println(s.replaceAll("0*(\\d+)","$1"));
        }
    }
}

    练习七:对邮件地址进行校验,要求:@前面字母数字_,@后面字母数字,.后面字母数字

1
2
3
4
5
6
7
8
9
10
import java.util.regex.*;
class RegularExpressions
{
    public static void main(String [] args){
        String mail = "115708873@qq.com";
        String regex =  "[a-zA-Z_0-9]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";//精确匹配
        regex = "\\w+@\\w+(\\.\\w+)+";//笼统匹配
        System.out.println(mail.matches(regex));
    }
}
posted @ 2013-04-06 00:20  郭彦君  阅读(137)  评论(0编辑  收藏  举报