java.util.regex包下的Pattern和Matcher詳解(正則匹配)


java正則表達式通過java.util.regex包下的Pattern類與Matcher類實現(建議在閱讀本文時,打開java API文檔,當介紹到哪個方法時,查看java API中的方法說明,效果會更佳). 

Pattern類用於創建一個正則表達式,也可以說創建一個匹配模式,它的構造方法是私有的,不可以直接創建,但可以通過 Pattern.complie(String regex) 簡單工廠方法創建一個正則表達式。 
Java代碼示例: 

Pattern p=Pattern.compile("\\w+"); 
p.pattern();//返回 \w+ 

compile(String regex) 將正則表達式編譯到Pattern中。該方法是個靜態方法;

pattern() 返回正則表達式的字符串形式,其實就是返回Pattern.complile(String regex)的regex參數 ;

 

1.Pattern.split(CharSequence input) 

Pattern有一個split(CharSequence input)方法,用於分隔字符串,並返回一個String[],我猜String.split(String regex)就是通過Pattern.split(CharSequence input)來實現的;
Java代碼示例: 

Pattern p=Pattern.compile("\\d+"); 
String[] str=p.split("我的姓名是:456456我的電話是:0532214我的郵箱是:aaa@aaa.com"); 

結果:str[0]="我的姓名是:" str[1]="我的電話是:" str[2]="我的郵箱是:aaa@aaa.com" 

 

2.Pattern.matcher(String regex,CharSequence input)

Pattern.matcher(String regex,CharSequence input)是一個靜態方法,用於快速匹配字符串,該方法適合用於只匹配一次,且匹配全部字符串;
Java代碼示例: 

Pattern.matches("\\d+","2223");//返回true 
Pattern.matches("\\d+","2223aa");//返回false,需要匹配到所有字符串才能返回true,這里aa不能匹配到 
Pattern.matches("\\d+","22bb23");//返回false,需要匹配到所有字符串才能返回true,這里bb不能匹配到 

 

3.Pattern.matcher(CharSequence input) 

Pattern.matcher(CharSequence input)返回一個Matcher對象. 
Matcher類的構造方法也是私有的,不能隨意創建,只能通過Pattern.matcher(CharSequence input)方法得到該類的實例. 
Pattern類只能做一些簡單的匹配操作,要想得到更強更便捷的正則匹配操作,那就需要將Pattern與Matcher一起合作.Matcher類提供了對正則表達式的分組支持,以及對正則表達式的多次匹配支持
Java代碼示例: 

Pattern p=Pattern.compile("\\d+"); 
Matcher m=p.matcher("22bb23"); 

m.pattern();//返回p 也就是返回該Matcher對象是由哪個Pattern對象的創建的 

 

4.Matcher.matches()

Matcher類提供三個匹配操作方法(Matcher.matches()/ Matcher.lookingAt()/ Matcher.find() ),三個方法均返回boolean類型,當匹配到時返回true,沒匹配到則返回false 
matches()對整個字符串進行匹配,只有整個字符串都匹配了才返回true 
Java代碼示例: 

Pattern p=Pattern.compile("\\d+"); 
Matcher m=p.matcher("22bb23"); 
m.matches();//返回false,因為bb不能被\d+匹配,導致整個字符串匹配未成功. 
Matcher m2=p.matcher("2223"); 
m2.matches();//返回true,因為\d+匹配到了整個字符串 

我們現在回頭看一下Pattern.matcher(String regex,CharSequence input),它與下面這段代碼等價 Pattern.compile(regex).matcher(input).matches() 

 

5.Matcher.lookingAt()

lookingAt()對前面的字符串進行匹配,只有匹配到的字符串在最前面才返回true 
Java代碼示例: 

Pattern p=Pattern.compile("\\d+"); 
Matcher m=p.matcher("22bb23"); 
m.lookingAt();//返回true,因為\d+匹配到了前面的22 
Matcher m2=p.matcher("aa2223"); 
m2.lookingAt();//返回false,因為\d+不能匹配前面的aa 

 

6.Matcher.find()

find()對字符串進行匹配,匹配到的字符串可以在任何位置. 
Java代碼示例: 

Pattern p=Pattern.compile("\\d+"); 
Matcher m=p.matcher("22bb23"); 
m.find();//返回true 
Matcher m2=p.matcher("aa2223"); 
m2.find();//返回true 
Matcher m3=p.matcher("aa2223bb"); 
m3.find();//返回true 
Matcher m4=p.matcher("aabb"); 
m4.find();//返回false 

 

7.Mathcer.start()/ Matcher.end()/ Matcher.group() 

當使用matches(),lookingAt(),find()執行匹配操作后,就可以利用以下三個方法得到更詳細的信息. 

start():返回匹配到的子字符串在字符串中的索引位置. 
end():返回匹配到的子字符串的最后一個字符在字符串中的索引位置. 
group():返回匹配到的子字符串 

Java代碼示例: 

Pattern p=Pattern.compile("\\d+"); 
Matcher m=p.matcher("aaa2223bb"); 
m.find();//匹配2223 
m.start();//返回3 
m.end();//返回7,返回的是2223后的索引號 
m.group();//返回2223 

 

Mathcer m2=p.matcher("2223bb"); 
m2.lookingAt();   //匹配2223 
m2.start();   //返回0,由於lookingAt()只能匹配前面的字符串,所以當使用lookingAt()匹配時,start()方法總是返回0 
m2.end();   //返回4 
m2.group();   //返回2223 

 

Matcher m3=p.matcher("2223"); //如果Matcher m3=p.matcher("2223bb"); 那么下面的方法出錯,因為不匹配返回false
m3.matches();   //匹配整個字符串 
m3.start();   //返回0
m3.end();   //返回3,原因相信大家也清楚了,因為matches()需要匹配所有字符串 
m3.group();   //返回2223

 

start(),end(),group()均有一個重載方法它們是start(int i),end(int i),group(int i)專用於分組操作,Mathcer類還有一個groupCount()用於返回有多少組. 

Pattern p=Pattern.compile("([a-z]+)(\\d+)"); 
Matcher m=p.matcher("aaa2223bb"); 
m.find();   //匹配aaa2223 
m.groupCount();   //返回2,因為有2組 
m.start(1);   //返回0 返回第一組匹配到的子字符串在字符串中的索引號 
m.start(2);   //返回3 
m.end(1);   //返回3 返回第一組匹配到的子字符串的最后一個字符在字符串中的索引位置. 
m.end(2);   //返回7 
m.group(1);   //返回aaa,返回第一組匹配到的子字符串 
m.group(2);   //返回2223,返回第二組匹配到的子字符串 

 

例子:

  例如有一段文本(我的QQ是:3609789 我的電話是:0532214 我的郵箱是:aaa123@aaa.com),里面有很多數字,而且這些數字是分開的,我們現在要將文本中所有數字都取出來,利用java的正則操作是那么的簡單. 

Pattern p=Pattern.compile("\\d+"); 
Matcher m=p.matcher("我的QQ是:3609789 我的電話是:0532214 我的郵箱是:aaa123@aaa.com"); 
while(m.find()) { 
     System.out.println(m.group()); 
} 

輸出:
  3609789
  0532214 
  123 

 

       總結:                                                                                                                                                                                                                           

現在應該知道,每次執行匹配操作后start(),end(),group()三個方法的值都會改變,改變成匹配到的子字符串的信息,以及它們的重載方法,也會改變成相應的信息. 

只有當匹配操作成功,才可以使用start(),end(),group()三個方法,否則會拋出java.lang.IllegalStateException,也就是當matches(),lookingAt(),find()其中任意一個方法返回true時,才可以使用.

Pattern與Matcher一起合作,Matcher類提供了對正則表達式的分組支持,以及對正則表達式的多次匹配支持.。單獨用Pattern只能使用Pattern.matcher(String regex,CharSequence input)一種最基礎最簡單的匹配。

Pattern.compile(regex).matcher(input).matches()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM