Java 正則表達式


正則表達式,又稱規則表達式。(英文名Regular Expression,所以代碼中常以regex、regexp、RE表示)。

正則表達式簡單說就是用於操作文本數據的規則表達式,在Java中我們使用正則表達式來對字符串進行“有規則的操作”,沒理解沒關系,看下面的練習就懂了。

正則表達式對字符串的常見操作:字符串的匹配切割替換獲取

正則表達式語法(匹配規則

 

字符串的匹配:matches()

用法:

/*常用寫法*/
1. boolean b = Pattern.matches("正則表達式", "匹配內容");

/*標准寫法*/
2.Pattern p = Pattern.compile("正則表達式");  Matcher m = p.matcher("匹配內容");  
   boolean b = m.matches();

/*語句匹配寫法*/
3.if(/^a*b$/.text("aaab")) {};

舉例練習:

1.判斷輸入的字符串是否為合法手機號碼。

public class regexTest {
    public static void main(String[] args) {
        String p1 = "15845678908";
        String p2 = "173438576288";
        boolean b1 = isphone_num(p1);
        boolean b2 = isphone_num(p2);
        System.out.println(p1+"是電話號碼嗎?"+b1);
        System.out.println(p2+"是電話號碼嗎?"+b2); 
    }    
    //匹配方法(以1開頭第二位必須是3/5/7/8的11位純數字組成)
    public static boolean isphone_num(String num) {
        //定義匹配規則:
        String regex = "1[3578][0-9]{9}";
        
        //判斷是否符合規則
        boolean b = num.matches(regex);
        return b;
    }
}

結果:

2.判斷郵箱是否為正確格式。

public class regexTest {
    public static void main(String[] args) {
        String p1 = "abc123@qq.com";
        String p2 = "ghtr343com";
        String p3 = "hkp123@163.com";
        boolean b1 = isemail(p1);
        boolean b2 = isemail(p2);
        boolean b3 = isemail(p3);
        System.out.println(p1+"是否為郵箱格式?"+b1);
        System.out.println(p2+"是否為郵箱格式?"+b2); 
        System.out.println(p3+"是否為郵箱格式?"+b3); 
    }    
    //匹配方法(以幾個字母或數字開頭 + @ +字母數字+.+字母)
    public static boolean isemail(String email) {
        //定義匹配規則:
        String regex = "[a-z0-9]+@[a-zA-Z0-9]+\\.[a-zA-Z]+";
        
        //判斷是否符合規則
        boolean b = email.matches(regex);
        return b;
    }
}

結果:

3.判斷身份證號碼是否為正確格式

xxxxxx    yy MM dd    25 0     15位(第一代身份證,2004年之前)

xxxxxx yyyy MM dd 725 0     18位(第二代身份證)

地區: [1-9]\d{5}

年的前兩位: (18|19|([23]\d))            1800-2399

年的后兩位: \d{2}

月份: ((0[1-9])|(10|11|12)) 

天數: (([0-2][1-9])|10|20|30|31)          閏年不能禁止29+

三位順序碼: \d{3}

兩位順序碼: \d{2}

校驗碼: [0-9Xx]

//身份證正則表達式(15位)
isIDCard1="^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$ "

//身份證正則表達式(18位)
isIDCard2="^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$ "

字符串切割:split()

對字符串進行切割就是對一個字符串按照某個或某些字符進行切割,從而變成若干字符串,切割的實質其實就是先進行字符串匹配,將匹配到的字符串“丟棄”,並將丟掉的前面部分和剩下的部分變成字符串數組。

用法:

String str = "需要切割的字符串";
//描述切割規則
String regex = "正則表達式";

//切割后的字符串仍是字符串:
String sstr1 = str.split(regex);

//切割后的字符串放在數組中:
String[] sstr2 = str.split(regex);

舉例練習:

對字符串“哈哈##呵呵###哦哦#”進行切割,去掉#符號。

public class splitTest {
    public static void main(String[] args) {
        
        String s = "哈哈##呵呵###哦哦#";
        
        //描述切割規則:以若干#來切割
        String regex = "#+";
        
        //切割后的字符串數組:
        String[] sstr1 = s.split(regex);
        for(String string:sstr1){
            System.out.print(string);
        }
        
    }
}

結果: 

拓展:疊詞切割 String regex = "(.)\\1+",這里用到了組的概念。

 

字符串替換:replaceAll()

利用正則表達式進行字符串替換其實是先匹配指定字符串中的字符,然后再用自定義字符替換掉匹配到的字符串。 

用法:

String str = "需要替換的字符串";      
//匹配規則
String regex = "正則表達式";
String Str = str.replaceAll(regex, "替換內容");

舉例練習:

對字符串“哈嘍##你好###大聰明”進行字符替換,把"#"替換成"、"。

public class replaceAllTest {
    public static void main(String[] args) {
        
        String str = "哈嘍##你好###大聰明";
        
        //匹配規則
        String regex = "(.)\\1+";
        
        //替換為:
        String newStr = str.replaceAll(regex, "、");
        
        //替換后結果:
        System.out.println(newStr);
    }
    
}

 結果:

拓展:替代疊詞 regex = "(.)\\1+";  String str2 = str1.replaceAll(regex, "$1");//多個重復只留一個

 

字符串獲取:group()

正則表達式其實是封裝成了Pattern類,所以字符串的匹配、切割、替換都是調用了Pattern類中的方法。所以如果我們需要獲取指定字符串中的子串,首先同樣的我們需要進行字符串匹配,然后判斷指定字符串中是否有匹配的子串,有就獲取,沒有就獲取不到。

獲取子串的步驟:

  1、描述要獲取的子串:匹配子串

  2、使用正則表達式的封裝類Pattern來獲取匹配器

  3、使用匹配器中的方法group()獲取字符串的匹配的子串

舉例練習:

1、獲取字符串“Hi ! welcome to my blog haha”中為兩個字母的單詞.

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

public class groupTest {
    public static void main(String[] args) {
        String s = "Hi ! welcome to my blog haha";
        
        //1、匹配子串
        String regex = "\\b[a-zA-Z]{2}\\b";
        
        //2、獲取匹配器
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(s);
        
        //3、使用匹配器的group()方法來獲取:(find方法是判斷是否具有匹配子串)、
        System.out.println("”"+s+"“中的兩個字母的單詞有:");
        while(m.find()){
            System.out.println(m.group());
        }
    }

 結果:

 

匹配規則

 

 

 

 


 

圖片來源:https://www.cnblogs.com/fzz9/p/7744554.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM