閱讀944 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Java常用類庫--正則表達式(Pattern類、Matcher類)

1、認識正則


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 = "1234567890" ;		// 此字符串由數字組成
		if(Pattern.compile("[0-9]+").matcher(str).matches()){	// 使用正則
			System.out.println("是由數字組成!") ;
		}else{
			System.out.println("不是由數字組成!") ;
		}
	}
};

2、Pattern、Matcher類





以上的正則,如果要想驅動起來,則必須依靠Pattern類和Matcher類。
Pattern主要是表示一個規則的意思,即:正則表達式的規則需要在Pattern類中使用。
Matcher類主要表示使用Pattern指定好的驗證規則。





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 = "A1B22C333D4444E55555F" ;	// 指定好一個字符串
		String pat = "\\d+" ;	// 指定好正則表達式
		Pattern p = Pattern.compile(pat) ;	// 實例化Pattern類
		String s[] = p.split(str) ;	// 執行拆分操作
		for(int x=0;x<s.length;x++){
			System.out.print(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 = "A1B22C333D4444E55555F" ;	// 指定好一個字符串
		String pat = "\\d+" ;	// 指定好正則表達式
		Pattern p = Pattern.compile(pat) ;	// 實例化Pattern類
		Matcher m = p.matcher(str) ;	// 實例化Matcher類的對象
		String newString = m.replaceAll("_") ;
		System.out.println(newString) ;
	}
};

3、String類對正則的支持

從之前的操作中,可以發現,很多的代碼除了要求的字符串不同,使用的正則規則不同,基本上就沒有什麼特別的了。
所以在JDK1.4之後,Java對正則進行了一些擴充,在String中開始直接支持正則的操作。

import java.util.regex.Pattern ;
import java.util.regex.Matcher ;
public class RegexDemo06{
	public static void main(String args[]){
		String str1 = "A1B22C333D4444E55555F".replaceAll("\\d+","_") ;
		boolean temp = "1983-07-27".matches("\\d{4}-\\d{2}-\\d{2}") ;
		String s[] = "A1B22C333D4444E55555F".split("\\d+") ;
		System.out.println("字符串替換操作:" + str1) ;
		System.out.println("字符串驗證:" + temp) ;
		System.out.print("字符串的拆分:") ;
		for(int x=0;x<s.length;x++){
			System.out.print(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" ;			// 定義一個字符串
		// 拆分的形式:
		/*
			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]) ;
		}
	}
};

如果有時候發現一個字符串無法按照指定的字符拆分的話,則需要使用“\”轉義,轉義的時候兩個“\”表示一個“\”。

4、總結

1、使用正則可以方便的完成字符串的驗證、拆分、替換等複雜功能。
2、在開發中一般會直接使用String類中提供好的正則支持,而往往很少直接使用Pattern類或Matcher類。
3、在一些正則應用的時候,對於一些敏感的字符要進行轉義操作。

最後更新:2017-04-03 14:53:53

  上一篇:go HTTP協議返回狀態碼大全
  下一篇:go innodb 命中率評估