Java學習總結:38(正則表達式)

正則表達式

正則表達式本質上是一種字符串操作語法規則,利用它我們能更加靈活地實現字符串的匹配、拆分、替換等操作。

正則標記

所有的正則表達式支持的類都定義在java.util.regex包裏面。這個包裏面定義瞭如下兩個主要的類:
1.Pattern類:主要定義要使用的表達式對象
2.Matcher類:用於進行正則標記與指定內容的匹配操作。

所有可以使用的正則標記都在java.util.regex.Pattern類說明文檔中定義,常用的標記有如下6類:

1.單個字符(數量:1)

  • 字符:表示由一位字符組成;
  • \\\:表示轉義字符“\”;
  • \t:表示一個“\t”符號;
  • \n:表示一個“\n”符號;

2.字符集(數量:1)

  • [abc]:表示可能是字符a、字符b、字符c中的任意一位;
  • [^abc]:表示不是字符a,b、c中的任意一位;
  • [a-z]:所有的小寫字母;
  • [a-zA-Z]:表示任意的一位字母,不區分大小寫;
  • [0-9]:表示任意的一位數字;

3.簡化的字符集表達式(數量:1)

  • .:表示任意的一位字符;
  • \d:等價於“[0-9]”,屬於簡化寫法;
  • \D:等價於“[^0-9]”,屬於簡化寫法;
  • \s:表示任意的空白字符,例如:“\t”、“\n”;
  • \S:表示任意的非空白字符;
  • \w:等價於“[a-zA-Z_0-9]”,表示由任意的字母、數字、_組成;
  • \W:等價於“[a-zA-Z_0-9]”,表示不是由任意的字母、數字、_組成;

4.邊界分配

  • ^:正則的開始;
  • $:正則的結束;

5.數量表達

  • 正則?:表示此正則可以出現0次或1次;
  • 正則+:表示此正則可以出現1次或1次以上;
  • 正則*:表示此正則可以出現0次、1次或多次;
  • 正則{n}:表示此正則正好出現n次;
  • 正則{n,}:表示此正則出現n次以上(包含n次);
  • 正則{n,m}:表示此正則出現n~m次;

6.邏輯運算

  • 正則1正則2:正則1判斷完成後繼續判斷正則2;
  • 正則1|正則2:正則1或是正則2有一組滿足即可;
  • (正則):將多個正則作爲一組,可以爲這一組單獨設置出現的次數。

Pattern類常用方法

No. 方法名稱 類型 描述
1 public static Pattern compile(String regex) 普通 編譯正則表達式
2 public String[] split(CharSequence input) 普通 數據全拆分操作
3 public String[] split(CharSequence input,int limit) 普通 數據部分拆分操作
4 public Matcher matcher(CharSequence input) 普通 取得Matcher類對象

注意:Pattern類沒有定義構造方法,所以想要取得Pattern類對象,必須利用compile()方法進行正則表達式的編譯操作。同時,因爲在Pattern類中定義的方法,在進行參數接收時接收的都是CharSequence接口對象,所以只要是CharSequence接口的子類都可以進行正則操作。

例:利用Pattern類實現字符串拆分

package Project.Study.PatternClass;

import java.util.Arrays;
import java.util.regex.Pattern;

public class Test1 {
    public static void main(String[]args){
        String str="hello3232world32!!!";
        String regex="\\d+";
        Pattern pattern=Pattern.compile(regex);		//編譯正則
        String[] result =pattern.split(str);		//拆分字符串
        System.out.println(Arrays.toString(result));
    }
}
//結果:
//[hello, world, !!!]

Matcher類常用方法

No. 方法名稱 類型 描述
1 public boolean matches() 普通 正則匹配
2 public String replaceAll(String replacement) 普通 全部替換
3 public String replaceFirst(String replacement) 普通 替換首個

例:實現字符串驗證操作

package Project.Study.MatcherClass;

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

public class Test1 {
    public static void main(String[]args){
        String str="100";
        String regex="\\d+";
        Pattern pattern=Pattern.compile(regex);	//編譯正則
        Matcher matcher=pattern.matcher(str);	//進行正則匹配
        System.out.println(matcher.matches());	//匹配結果
    }
}
//結果:
//true

String類對正則的支持

事實上,在實際開發中String類使用得較多,大部分情況下都會使用String類中提供的方法來直接簡化正則操作,只有很少的情況下才會使用Pattern類和Matcher類操作正則。

String類與正則有關的5個操作方法

No. 方法名稱 類型 描述
1 public boolean matches(String regex) 普通 正則驗證,使用指定的字符串判斷其是否符合給出的正則表達式結構
2 public String replaceAll(String regex,String replacement) 普通 將滿足正則標記的內容全部替換爲新的內容
3 public String replaceFirst(String regex,String replacement) 普通 將滿足正則標記的首個內容替換爲新的內容
4 public String[] split(String regex) 普通 按照指定的正則標記進行字符串的全拆分
5 public String[] split(String regex,int limit) 普通 按照指定的正則標記進行字符串的部分拆分

上面5個方法包括字符串的替換、拆分、驗證操作,下面我們就來實現一下

例:實現字符串的替換

package Project.Study.Regex;

public class Test1 {
    public static void main(String[]args){
        String str="hel12l32o232121wQo@#rl32d!!!";//給出一組混亂的字符串
        String regex="[^a-z]";		//編寫正則,剔除所有不是小寫字母的字符
        System.out.println(str.replaceAll(regex,""));//字符串替換
    }
}
//結果:
//helloworld

例:字符串的拆分

package Project.Study.Regex;

public class Test2 {
    public static void main(String[]args){
        String str="hello090world3241!!!";
        String regex="\\d+";	//表示"[0-9]"一位以上的整數位,屬於簡化寫法,因爲是在字符串中定義的,所以用"\\"代替"\",屬於轉義字符操作
        String[] result =str.split(regex);
        for (String s : result) {
            System.out.println(s);	//輸出分隔好的字符串
        }
    }
}
//結果:
//hello
//world
//!!!

正則驗證的應用

若是字符串是帶小數點".“的數字呢(小數點”."在正則中表示任意字符),我們又應該怎麼將其轉換爲浮點型數據?
例:將字符型數字轉換爲浮點型數據

package Project.Study.Regex;

public class Test3 {
    public static void main(String[]args){
        String str1="10.01";
        String str2="10.10";
        String regex="\\d+(\\.\\d+)?";
        if(str1.matches(regex)){		//轉型前要進行驗證
            System.out.println(Double.parseDouble(str1));
        }
        if(str2.matches(regex)){		//轉型前要進行驗證
            System.out.println(Double.parseDouble(str2));
        }
    }
}
//結果:
//10.01
//10.1

上程序中的正則解析:
在這裏插入圖片描述
上程序中的"?"表示該小數位可能出現0次或1次。
上程序中使用了matches()方法進行正則驗證,同理,我們也可以用它來判斷其他,例如:IP地址

例:

package Project.Study.Regex;

public class Test4 {
    public static void main(String[]args){
        String str1="192.168.1.1";
        String str2="192.1683.1.1";
        String regex1="\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}";//該正則中的"\\d{1,3}"表示1~3位數字
        String regex2="(\\d{1,3}\\.){3}\\d{1,3}";		//簡化正則操作
        System.out.println(str1.matches(regex1));
        System.out.println(str1.matches(regex2));
        System.out.println(str2.matches(regex1));
        System.out.println(str2.matches(regex2));
    }
}

//結果:
//true
//true
//false
//false

例:判斷日期格式是否正確

package Project.Study.Regex;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Test5 {
    public static void main(String[]args) throws ParseException {
        String str="2013-8-15";
        String regex="\\d{4}-\\d{1,2}-\\d{1,2}";	//定義驗證正則
        if(str.matches(regex)){						//符合規則
            Date date=new SimpleDateFormat("yyyy-MM-dd").parse(str);
            System.out.println(date);
        }
    }
}
//結果:
//Thu Aug 15 00:00:00 CST 2013
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章