【Java常用類庫】_Regex筆記
本章目標:
掌握Regex的作用
掌握Regex的匹配模式
掌握Pattern類和Matcher類的使用
掌握String對正則的支援
例如:現在要求判斷一個字串是否由數字組成,則可以有以下的兩種做法:
1.不使用正則;
2.使用正則;
執行個體一:
public class RegexDemo01{ public static void main(String[] args){ String str = "1234567890"; //此字串由數字組成 boolean flag = true; //定義一個標識變數 char[] c = str.toCharArray(); //將字串變為字元數組 for(int i=0;i<c.length;i++){ if(c[i]<'0'||c[i]>'9'){ flag = false; break; //程式不再向下繼續執行 } } if(flag){ System.out.println("是由數字組成!"); }else{ System.out.println("不是由數字組成!"); } }}
執行個體二:
import java.util.regex.Pattern;public class RegexDemo02{ public static void main(String[] args){ String str = "13456789"; //此字串由數字組成 if(Pattern.compile("[0-9]+").matcher(str).matches()){ System.out.println("是由數字組成!"); }else{ System.out.println("不是由數字組成!"); } }}
可以發現使用正則作業碼更加簡單。
3.2、Pattern、Matcher類
這兩個類都定義在java.util.regex包中
Pattern類的主要作用是進行正則規範(如之前的“[0-9]”就屬於正則規範)
而Matcher類主要是執行規範,驗證一個字串是否符合其規範。
常用正則規則一:
No 規範 描述
1 \\ 表示反斜線(\)字元
2 \t 表示定位字元
3 \n 表示換行
4 [abc] 字元a、b或c
5 [^abc] 除a、b、c之外的任一字元
6 [a-zA-Z0-9] 表示由數字、字母組成
7 \d 表示數字
8 \D 表示非數字
9 \w 表示數字、字母、底線
10 \W 表示非數字、字母、底線
11 \s 表示所有空白字元(換行、空格等)
12 \S 表示所有非空白字元
13 ^ 行的開頭
14 $ 行的結尾
15 . 匹配除換行外的任意一個字元
\d:表示數字,[0-9]
\D:表示非數字,[^0-9]
\w:表示字母、數字、底線,[a-zA-Z0-9]
\W:[^a-zA-Z0-9]
常用正則規則二:
數量表示(X表示一組規範)
No 規範 描述
1 X 必須出現一次
2 X? 可以出現0次或1次
3 X* 可以出現0次或多次
4 X+ 可以出現一次或多次
5 X{n} 可以出現N次
6 X{n,} 可以出現N次以上
7 X{n,m} 必須出現n次到m次
邏輯運算子(X、Y表示一組規範)
No 規範 描述
1 XY X規範後跟著Y規範
2 X|Y X規範或Y規範
3 (X) 做為一個捕捉組規範
以下的正則,如果要想驅動起來,則必須依靠Pattern或Matcher類。
Pattern主要是表示一個規則的意思,即:Regex的規則需要在Pattern類中使用。
Matcher類主要表示使用Pattern指定好的驗證規則。
Pattern類的常用方法
No 方法 類型 描述
1 public static Pattern compile(String regex) 普通 指定Regex規則
2 public Matcher matcher(CharSequence input) 普通 返回Matcher類執行個體
3 public String[] split(CharSequence input) 普通 字串拆分
在Pattern類中如果要想取得Pattern類執行個體,則必須調用compile()方法。
本類中沒有明確的構造方法可以供使用者使用,那麼肯定此類的構造方法被私人化了,則可以直接從Pattern類中取得本類的執行個體。
指定好操作的正則:public static Pattern compile(String regex)
可以為matcher類執行個體化:public Matcher matcher(CharSequence input)
拆分:public String[] split(CharSequence input)
回顧:String 中也存在拆分操作。
Matcher類的常用方法:
如果要驗證一個字串是否符合規範,則可以使用Matcher類
No 方法 類型 描述
1 public boolean matches 普通 執行驗證
2 public String replaceAll(String replacement) 普通 字串替換
執行個體二:驗證一個字串是否是合法的日期格式
import java.util.regex.Pattern;import java.util.regex.Matcher;public class RegexDemo03{ public static void main(String args[]){ String str = "1983-07-27"; String pat = "\\d{4}-\\d{2}-\\d{2}"; Pattern p = Pattern.compile(pat); //執行個體化Pattern類 Matcher m = p.matcher(str); //執行個體化Matcher類 if(m.matches()){ //進行驗證的匹配,使用正則 System.out.println("日期格式合法!"); }else{ System.out.println("日期格式不合法!"); } }}
在Pattern類中也可以使用正則進行字串的拆分功能。
import java.util.regex.Pattern;import java.util.regex.Matcher;public class RegexDemo04{ public static void main(String args[]){ String str = "A1B22C333D444E55555F"; String pat = "\\d+"; //指定好Regex Pattern p = Pattern.compile(pat); String s[] = p.split(str); //執行拆分操作 for(int x=0;x<s.length;x++){ System.out.println(s[x]+"\t"); } }}
還可以使用Matcher類中的替換功能。
範例:將字串中的全部數字替換成“_”
import java.util.regex.Pattern;import java.util.regex.Matcher;public class RegexDemo05{ public static void main(String args[]){ String str = "A1B22C333D444E55555F"; String pat = "\\d+"; //指定好Regex Pattern p = Pattern.compile(pat); Matcher m = p.matcher(str); String newString = m.replaceAll("_"); System.out.println(newString); }}
只要使用正則的驗證的規則,那麼就可以匹配各種複雜的字串。
3.3、String 類對正則的支援
從之前的操作中,可以發現,很多的代碼除了要求的字串不同,使用的正則規則不同,基本上就沒有什麼特別的了。
所以在JDK1.4之後,java對正則進行了一些擴充,在String 中開始直接支援正則的操作。
String 對Regex的支援
在String 類中有以下三個方法是支援正則操作的。
No. 方法 類型 描述
1 public boolean matches(String regex) 普通 字串匹配
2 public String replaceAll(String regex,String replacement) 普通 字串替換
3 public String[] split(String regex) 普通 字串拆分
import java.util.regex.Pattern;import java.util.regex.Matcher;public class RegexDemo06{ public static void main(String[] args){ String str = "A1B22C333D444E55555F".replaceAll("\\d+","_"); boolean temp = "1982-07-27".matches("\\d{4}-\\d{2}-\\d{2}"); String s[] = "A1B22C333D444E55555F".split("\\d+"); System.out.println("字串替換操作:"+str); System.out.println("字串驗證:"+temp); System.out.println("字串的拆分:"); for(int x=0;x<s.length;x++){ System.out.println(s[x]+"\t"); } }}
但是,在使用正則的時候有一點是需要特別注意的。
現在,假設有如下一個字串的拆分程式。
import java.util.regex.Pattern;import java.util.regex.Matcher;public class RegexDemo07{ public static void main(String[] args){ String info = "LXH:98|MLDN:90|LI:100"; String s[] = info.split("\\|"); System.out.println("字串拆分:"); for(int x=0;x<s.length;x++){ String s2[] = s[x].split(":"); System.out.println(s2[0]+"\t"+s2[1]); } }}
如果有時候發現一個字串無法按照指定的字元拆分的話,則需要使用"\"轉義,轉義的時候兩個"\"表示一個"\"。