黑馬程序員_正則表達式

------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流! -------


1 概述

    正則表達式:正則表達式用於操作字符串數據。通過一些特定的符號來體現的。所以我們爲了掌握正則表達式,必須要學習一些符號。雖然簡化了,但是閱讀性差。

    需求:定義一個功能對QQ號進行校驗。
    要求:長度5~15. 只能是數字, 0不能開頭


不用正則表達式的做法:

public class RegexDemo {
    public static void main(String[] args) {
        String qq = "123k4567";
        checkQQ(qq);
    }
    public static void checkQQ(String qq){
        int len = qq.length();
        if(len>=5 && len<=15){
            
            if(!qq.startsWith("0")){
                try {
                    long l = Long.parseLong(qq);
                    System.out.println(l+":正確");
                }catch(NumberFormatException e){
                    System.out.println(qq+":含有非法字符");
                }
            }else{
                System.out.println(qq+":不能0開頭");
            }

        }else{
            System.out.println(qq+":長度錯誤");
        }
        
    }
}
正則表達式的做法:

public class RegexDemo {
    public static void main(String[] args) {
        String qq = "123k4567";
        
        String regex = "[1-9][0-9]{4,14}";//正則表達式。
        
        boolean b = qq.matches(regex);//String類中的方法,接受的必須是具備某種規則的字符串就是正則表達式,如果qq這個字符串與regex這個正則表達式匹配返回true
        System.out.println(qq+":"+b);
    }
}


2 正則表達式對字符串的常見操作-獲取

    將正則規則進行對象的封裝。Pattern p = Pattern.compile("a*b");
    通過正則對象的matcher方法字符串相關聯。獲取要對字符串操作的匹配器對象Matcher .Matcher m = p.matcher("aaaaab");
    通過Matcher匹配器對象的方法對字符串進行操作。boolean b = m.matches();

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexDemo {
    public static void main(String[] args) {        
        functionDemo();
    }
    public  static void functionDemo() {
        
        String str = "da jia hao,ming tian bu fang jia!";
        
        String regex = "\\b[a-z]{3}\\b";
        
        //1,將正則封裝成對象。
        Pattern p = Pattern.compile(regex);
        //2, 通過正則對象獲取匹配器對象。 
        Matcher m = p.matcher(str);
        
        //使用Matcher對象的方法對字符串進行操作。
        //既然要獲取三個字母組成的單詞 
        //查找。 find();
        System.out.println(str);
        while(m.find()){
            System.out.println(m.group());//獲取匹配的子序列
            
            System.out.println(m.start()+":"+m.end());
        }
    }

3 正則表達式對字符串的常見操作-切割

    其實使用的就是String類中的split方法。

public class Test {
    public static void main(String[] args) {
        functionDemo();
    }

    public static void functionDemo() {
        String str = "zhangsan xiao zhaoliu";
        String[] names = str.split(" ");//用空格來切時候,如果有很多空格,切出來的效果就不好了
        for(String name : names){
            System.out.println(name);
        }
    }
}
public class Test {
    public static void main(String[] args) {
        functionDemo();
    }

    public static void functionDemo() {
        String str = "zhangsan       xiaoqiang          zhaoliu";
        
        String[] names = str.split(" +");//表示多個空格
        
        for(String name : names){
            System.out.println(name);
        }
    }
}
public class Test {
    public static void main(String[] args) {
        functionDemo();
    }

    public static void functionDemo() {
        
        String str = "zhangsan.xiaoqiang.zhaoliu";
        
        String[] names = str.split("\\.");
        
        for(String name : names){
            System.out.println(name);
        }
    }
}
 組:((A)(B(C)))
public class Test {
    public static void main(String[] args) {
        functionDemo();
    }

    public static void functionDemo() {
        String str = "zhangsanttttxiaoqiangmmmmmmzhaoliu";
        
        String[] names = str.split("(.)\\1+");//加上括號進行封裝,有編號
        
        for(String name : names){
            System.out.println(name);
        }
    }
}

4 正則表達式對字符串的常見操作-替換

    其實使用的就是String類中的replaceAll()方法。

public class RegexDemo {
    public static void main(String[] args) {

        functionDemo();
    }
    public static void functionDemo() {
        
        String str = "zhangsanttttxiaoqiangmmmmmmzhaoliu";
        
        str = str.replaceAll("(.)\\1+", "$1");
        
        System.out.println(str);
        
        String tel = "15800001111";//158****1111;
        
        tel = tel.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
        
        System.out.println(tel);
    }
}

5 正則表達式對字符串的常見操作_匹配

    其實使用的就是String類中的matches方法。

public class RegexDemo {
    public static void main(String[] args) {
        functionDemo();
    }
    //演示匹配:匹配手機號碼是否正確。 
    public static void functionDemo(){
        String tel = "15800001111";
        //String regex = "1[358][0-9]{9}";
        String regex = "1[358]\\d{9}";//用到反斜線的時候要用到兩個,因爲只用一個的話會把d給轉義了  
        
        boolean b = tel.matches(regex);
        System.out.println(tel+":"+b);
    }
}

6 練習

1.對ip地址排序:192.168.10.34 127.0.0.1 3.3.3.3  105.70.11.55

public class RegexTest {
    public static void main(String[] args) {
        test();
    }
    public static void test(){
        
        String ip_str = "192.168.10.34  127.0.0.1  3.3.3.3  105.70.11.55  225.234.234.255";
        
        
        //1,爲了讓ip可以按照字符串順序比較,只要讓ip的每一段的位數相同。
        //所以,補零,按照每一位所需做多0進行補充。每一段都加兩個0.
        
        ip_str = ip_str.replaceAll("(\\d+)", "00$1");
        System.out.println(ip_str);
        
        //然後每一段保留數字3位。
        ip_str = ip_str.replaceAll("0*(\\d{3})", "$1");
        System.out.println(ip_str);
        
        
        //將ip地址切出。
        String[] ips = ip_str.split(" +");
        
        TreeSet<String> ts = new TreeSet<String>();
        
        for(String  ip : ips){
//            System.out.println(ip);
            ts.add(ip);
        }
        
        for(String ip : ts){
            System.out.println(ip.replaceAll("0*(\\d+)", "$1"));
        }
        
    }

}


 2.對郵件地址校驗

public class RegexTest {
    public static void main(String[] args) {
        test();
    }
    public static void test() {
        
        String mail = "[email protected]";
        
        String regex = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]{1,3})+";
        
        regex = "\\w+@\\w+(\\.\\w+)+";//[email protected]
        
        
        
        boolean b = mail.matches(regex);
        
        System.out.println(mail+":"+b);    
    }

}








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章