1. 程式人生 > >JDK正則表示式API包

JDK正則表示式API包

1.簡介:
java.util.regex是一個用正則表示式所訂製的模式來對字串進行匹配工作的類庫包。

它包括兩個類:Pattern和Matcher Pattern 一個Pattern是一個正則表示式經編譯後的表現模式。
Matcher 一個Matcher物件是一個狀態機器,它依據Pattern物件做為匹配模式對字串展開匹配檢查。


首先一個Pattern例項訂製了一個所用語法與PERL的類似的正則表示式經編譯後的模式,然後一個Matcher例項在這個給定的Pattern例項的模式控制下進行字串的匹配工作。

以下我們就分別來看看這兩個類:

2.Pattern類:
Pattern的方法如下: static Pattern compile(String regex)
將給定的正則表示式編譯並賦予給Pattern類
static Pattern compile(String regex, int flags)
同上,但增加flag引數的指定,可選的flag引數包括:CASE INSENSITIVE,MULTILINE,DOTALL,UNICODE CASE, CANON EQ
int flags()
返回當前Pattern的匹配flag引數.
Matcher matcher(CharSequence input)
生成一個給定命名的Matcher物件
static boolean matches(String regex, CharSequence input)
編譯給定的正則表示式並且對輸入的字串以該正則表示式為模開展匹配,該方法適合於該正則表示式只會使用一次的情況,也就是隻進行一次匹配工作,因為這種情況下並不需要生成一個Matcher例項。
String pattern()
返回該Patter物件所編譯的正則表示式。
String[] split(CharSequence input)
將目標字串按照Pattern裡所包含的正則表示式為模進行分割。
String[] split(CharSequence input, int limit)
作用同上,增加引數limit目的在於要指定分割的段數,如將limi設為2,那麼目標字串將根據正則表示式分為割為兩段。


一個正則表示式,也就是一串有特定意義的字元,必須首先要編譯成為一個Pattern類的例項,這個Pattern物件將會使用matcher()方法來生成一個Matcher例項,接著便可以使用該 Matcher例項以編譯的正則表示式為基礎對目標字串進行匹配工作,多個Matcher是可以共用一個Pattern物件的。

現在我們先來看一個簡單的例子,再通過分析它來了解怎樣生成一個Pattern物件並且編譯一個正則表示式,最後根據這個正則表示式將目標字串進行分割:
import java.util.regex.*;
public class Replacement{
public static void main(String[] args) throws Exception {
// 生成一個Pattern,同時編譯一個正則表示式
Pattern p = Pattern.compile("[/]+");
//用Pattern的split()方法把字串按"/"分割
String[] result = p.split(
"Kevin has seen《LEON》seveal times,because it is a good film."
+"/ 凱文已經看過《這個殺手不太冷》幾次了,因為它是一部"
+"好電影。/名詞:凱文。");
for (int i=0; i<result.length; i++)
System.out.println(result[i]);
}
}




輸出結果為:

Kevin has seen《LEON》seveal times,because it is a good film.
凱文已經看過《這個殺手不太冷》幾次了,因為它是一部好電影。
名詞:凱文。

很明顯,該程式將字串按"/"進行了分段,我們以下再使用 split(CharSequence input, int limit)方法來指定分段的段數,程式改動為:
tring[] result = p.split("Kevin has seen《LEON》seveal times,because it is a good film./ 凱文已經看過《這個殺手不太冷》幾次了,因為它是一部好電影。/名詞:凱文。",2);

這裡面的引數"2"表明將目標語句分為兩段。

輸出結果則為:

Kevin has seen《LEON》seveal times,because it is a good film.
凱文已經看過《這個殺手不太冷》幾次了,因為它是一部好電影。/名詞:凱文。

由上面的例子,我們可以比較出java.util.regex包在構造Pattern物件以及編譯指定的正則表示式的實現手法與我們在上一篇中所介紹的Jakarta-ORO 包在完成同樣工作時的差別,Jakarta-ORO 包要先構造一個PatternCompiler類物件接著生成一個Pattern物件,再將正則表示式用該PatternCompiler類的compile()方法來將所需的正則表示式編譯賦予Pattern類:


PatternCompiler orocom=new Perl5Compiler();

Pattern pattern=orocom.compile("REGULAR EXPRESSIONS");

PatternMatcher matcher=new Perl5Matcher();

但是在java.util.regex包裡,我們僅需生成一個Pattern類,直接使用它的compile()方法就可以達到同樣的效果:
Pattern p = Pattern.compile("[/]+");

因此似乎java.util.regex的構造法比Jakarta-ORO更為簡潔並容易理解。

3.Matcher類:
Matcher方法如下: Matcher appendReplacement(StringBuffer sb, String replacement)
將當前匹配子串替換為指定字串,並且將替換後的子串以及其之前到上次匹配子串之後的字串段新增到一個StringBuffer物件裡。
StringBuffer appendTail(StringBuffer sb)
將最後一次匹配工作後剩餘的字串新增到一個StringBuffer物件裡。
int end()
返回當前匹配的子串的最後一個字元在原目標字串中的索引位置 。
int end(int group)
返回與匹配模式裡指定的組相匹配的子串最後一個字元的位置。
boolean find()
嘗試在目標字串裡查詢下一個匹配子串。
boolean find(int start)
重設Matcher物件,並且嘗試在目標字串裡從指定的位置開始查詢下一個匹配的子串。
String group()
返回當前查詢而獲得的與組匹配的所有子串內容
String group(int group)
返回當前查詢而獲得的與指定的組匹配的子串內容
int groupCount()
返回當前查詢所獲得的匹配組的數量。
boolean lookingAt()
檢測目標字串是否以匹配的子串起始。
boolean matches()
嘗試對整個目標字元展開匹配檢測,也就是隻有整個目標字串完全匹配時才返回真值。
Pattern pattern()
返回該Matcher物件的現有匹配模式,也就是對應的Pattern 物件。
String replaceAll(String replacement)
將目標字串裡與既有模式相匹配的子串全部替換為指定的字串。
String replaceFirst(String replacement)
將目標字串裡第一個與既有模式相匹配的子串替換為指定的字串。
Matcher reset()
重設該Matcher物件。
Matcher reset(CharSequence input)
重設該Matcher物件並且指定一個新的目標字串。
int start()
返回當前查詢所獲子串的開始字元在原目標字串中的位置。
int start(int group)
返回當前查詢所獲得的和指定組匹配的子串的第一個字元在原目標字串中的位置。


(光看方法的解釋是不是很不好理解?不要急,待會結合例子就比較容易明白了)

一個Matcher例項是被用來對目標字串進行基於既有模式(也就是一個給定的Pattern所編譯的

正則表示式)進行匹配查詢的,所有往Matcher的輸入都是通過CharSequence介面提供的,這樣做的目的在於可以支援對從多元化的資料來源所提供的資料進行匹配工作。

我們分別來看看各方法的使用:

★matches()/lookingAt ()/find():
一個Matcher物件是由一個Pattern物件呼叫其matcher()方法而生成的,一旦該Matcher物件生成,它就可以進行三種不同的匹配查詢操作:

matches()方法嘗試對整個目標字元展開匹配檢測,也就是隻有整個目標字串完全匹配時才返回真值。
lookingAt ()方法將檢測目標字串是否以匹配的子串起始。
find()方法嘗試在目標字串裡查詢下一個匹配子串。

以上三個方法都將返回一個布林值來表明成功與否。

★replaceAll ()/appendReplacement()/appendTail():
Matcher類同時提供了四個將匹配子串替換成指定字串的方法:

replaceAll()
replaceFirst()
appendReplacement()
appendTail()

replaceAll()與replaceFirst()的用法都比較簡單,請看上面方法的解釋。我們主要重點了解一下appendReplacement()和appendTail()方法。

appendReplacement(StringBuffer sb, String replacement) 將當前匹配子串替換為指定字串,並且將替換後的子串以及其之前到上次匹配子串之後的字串段新增到一個StringBuffer物件裡,而appendTail(StringBuffer sb) 方法則將最後一次匹配工作後剩餘的字串新增到一個StringBuffer物件裡。