正則表達式是一種可以用于模式匹配和替換的強有力的工具,一個正則表達式就是由普通的字符(例如字符 a 到 z)以及非凡字符(稱為元字符)組成的文字模式,它描述在查找文字主體時待匹配的一個或多個字符串。正則表達式作為一個模板,將某個字符模式與所搜索的字符串進行匹配。
正則表達式在字符數據處理中起著非常重要的作用,我們可以用正則表達式完成大部分的數據分析處理工作,如:判定一個串是否是數字、是否是有效的Email地址,從海量的文字資料中提取有價值的數據等等,假如不使用正則表達式,那么實現的程序可能會很長,并且輕易出錯。對這點本人深有體會,面對大量工具書電子檔資料的整理工作,假如不懂得應用正則表達式來處理,那么將是很痛苦的一件事情,反之則將可以輕松地完成,獲得事半功倍的效果。
由于本文目的是要介紹如何在java里運用正則表達式,因此對剛接觸正則表達式的讀者請參考有關資料,在此因篇幅有限不作介紹。
JAVA對正則表達式的支持:
在JDK1.3 或之前的JDK版本中并沒有包含正則表達式庫可供JAVA程序員使用,之前我們一般都在使用第三方提供的正則表達式庫,這些第三方庫中有源代碼開放的,也有需付費購買的,而現時在JDK1.4的測試版中也已經包含有正則表達式庫---java.util.regex。
故此現在我們有很多面向JAVA的正則表達式庫可供選擇,以下我將介紹兩個較具代表性的 Jakarta-ORO和 java.util.regex,首先當然是本人一直在用的 Jakarta-ORO:
Jakarta-ORO正則表達式庫
1.簡介:
Jakarta-ORO是最全面以及優化得最好的正則表達式API之一,Jakarta-ORO庫以前叫做OROMatcher,是由Daniel F. Savarese編寫,后來他將其贈與Jakarta PRoject,讀者可在Apache.org的網站 下載該API包。
許多源代碼開放的正則表達式庫都是支持Perl5兼容的正則表達式語法,Jakarta-ORO正則表達式庫也不例外,他與Perl 5正則表達式完全兼容。
2.對象與其方法:
★PatternCompiler對象:
我們在使用Jakarta-ORO API包時,最先要做的是,創建一個Perl5Compiler類的實例,并把它賦值給PatternCompiler接口對象。 Perl5Compiler是PatternCompiler接口的一個實現,答應你把正則表達式編譯成用來匹配的Pattern對象。
PatternCompiler compiler=new Perl5Compiler();
★Pattern對象:
要把所對應的正則表達式編譯成Pattern對象,需要調用compiler對象的compile()方法,并在調用參數中指定正則表達式。舉個例子,你可以按照下面這種方式編譯正則表達式"s[ahkl]y":
Pattern pattern=null;
try {
pattern=compiler.compile("s[ahkl]y ");
} catch (MalformedPatternException e) {
e.printStackTrace();
}
在默認的情況下,編譯器會創建一個對大小寫敏感的模式(pattern)。因此,上面代碼編譯得到的模式只匹配"say"、"shy"、 "sky"和"sly",但不匹配"Say"和"skY"。要創建一個大小寫不敏感的模式,你應該在調用編譯器的時候指定一個額外的參數:
pattern=compiler.compile("s[ahkl]y",Perl5Compiler.CASE_INSENSITIVE_MASK);
Pattern對象創建好之后,就可以通過PatternMatcher類用該Pattern對象進行模式匹配。
★PatternMatcher對象:
PatternMatcher 對象依據Pattern對象和字符串展開匹配檢查。你要實例化一個Perl5Matcher類并把結果賦值給PatternMatcher接口。 Perl5Matcher類是PatternMatcher接口的一個實現,它根據Perl 5正則表達式語法進行模式匹配:
PatternMatcher matcher=new Perl5Matcher();
PatternMatcher對象提供了多個方法進行匹配操作,這些方法的第一個參數都是需要根據正則表達式進行匹配的字符串:
1. boolean matches(String input, Pattern pattern):當要求輸入的字符串input和正則表達式pattern精確匹配時使用該方法。也就是說當正則表達式完整地描述輸入字符串時返回真值。
2. boolean matchesPrefix(String input, Pattern pattern):要求正則表達式匹配輸入字符串起始部分時使用該方法。也就是說當輸入字符串的起始部分與正則表達式匹配時返回真值。
3. boolean contains(String input, Pattern pattern):當正則表達式要匹配輸入字符串的一部分時使用該方法。當正則表達式為輸入字符串的子串時返回真值。
但以上三種方法只會查找輸入字符串中匹配正則表達式的第一個對象,假如當字符串可能有多個子串匹配給定的正則表達式時,那么你就可以在調用上面三個方法時用 PatternMatcherInput對象作為參數替代String對象,這樣就可以從字符串中最后一次匹配的位置開始繼續進行匹配,這樣就方便的多了。
用PatternMatcherInput對象作為參數替代String時,上述三個方法的語法如下:
1. boolean matches(PatternMatcherInput input, Pattern pattern)
2. boolean matchesPrefix(PatternMatcherInput input, Pattern pattern)
3. boolean contains(PatternMatcherInput input, Pattern pattern)
新聞熱點
疑難解答