本文章轉自: http://blog.csdn.net/cclovett/article/details/12448843 結論:Pattern與Matcher一起合作.Matcher類提供了對正則表達式的分組支持,以及對正則表達式的多次匹配支持. 單獨用Pattern只能使用Pattern.mat ...
本文章轉自: http://blog.csdn.net/cclovett/article/details/12448843
結論:Pattern與Matcher一起合作.Matcher類提供了對正則表達式的分組支持,以及對正則表達式的多次匹配支持. 單獨用Pattern只能使用Pattern.matcher(String regex,CharSequence input)一種最基礎最簡單的匹配。
Java正則表達式通過java.util.regex包下的Pattern類與Matcher類實現(建議在閱讀本文時,打開Java API文檔,當介紹到哪個方法時,查看java API中的方法說明,效果會更佳).
Pattern類用於創建一個正則表達式,也可以說創建一個匹配模式,它的構造方法是私有的,不可以直接創建,但可以通過 Pattern.complie(String regex) 簡單工廠方法創建一個正則表達式,
Java代碼示例:
Pattern p=Pattern.compile("\\w+"); p.pattern();//返回 \w+
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("我的QQ是:456456我的電話是:0532214我的郵箱是:[email protected]");
結果:str[0]="我的QQ是:" str[1]="我的電話是:" str[2]="我的郵箱是:[email protected]"
2. 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)
說了這麼多,終於輪到Matcher類登場了, 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.lookingAt()/ Matcher.find() Matcher類提供三個匹配操作方法,三個方法均返回boolean類型,當匹配到時返回true,沒匹配到則返回false
matches()對整個字元串進行匹配,只有整個字元串都匹配了才返回true
1 Pattern p=Pattern.compile("\\d+"); 2 Matcher m=p.matcher("22bb23"); 3 m.matches();//返回false,因為bb不能被\d+匹配,導致整個字元串匹配未成功. 4 Matcher m2=p.matcher("2223"); 5 m2.matches();//返回true,因為\d+匹配到了整個字元串
我們現在回頭看一下 Pattern.matcher(String regex,CharSequence input) ,它與下麵這段代碼等價
Pattern.compile(regex).matcher(input).matches()
lookingAt()對前面的字元串進行匹配,只有匹配到的字元串在最前面才返回true
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
find()對字元串進行匹配,匹配到的字元串可以在任何位置.
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
5. Mathcer.start()/ Matcher.end()/ Matcher.group()
當使用matches(),lookingAt(),find()執行匹配操作後,就可以利用以上三個方法得到更詳細的信息.
start()返回匹配到的子字元串在字元串中的索引位置.
end()返回匹配到的子字元串的最後一個字元在字元串中的索引位置.
group()返回匹配到的子字元串
1 Pattern p=Pattern.compile("\\d+"); 2 Matcher m=p.matcher("aaa2223bb"); 3 m.find();//匹配2223 4 m.start();//返回3 5 m.end();//返回7,返回的是2223後的索引號 6 m.group();//返回2223 7 8 Mathcer m2=p.matcher("2223bb"); 9 m2.lookingAt(); //匹配2223 10 m2.start(); //返回0,由於lookingAt()只能匹配前面的字元串,所以當使用lookingAt()匹配時,start()方法總是返回0 11 m2.end(); //返回4 12 m2.group(); //返回2223 13 14 Matcher m3=p.matcher("2223"); //如果Matcher m3=p.matcher("2223bb"); 那麼下麵的方法出錯,因為不匹配返回false 15 m3.matches(); //匹配整個字元串 16 m3.start(); //返回0 17 m3.end(); //返回3,原因相信大家也清楚了,因為matches()需要匹配所有字元串 18 m3.group(); //返回2223
說了這麼多,相信大家都明白了以上幾個方法的使用,該說說正則表達式的分組在java中是怎麼使用的.
start(),end(),group() 均有一個重載方法它們是 start(int i),end(int i),group(int i) 專用於分組操作,Mathcer類還有一個groupCount()用於返回有多少組.
1 Pattern p=Pattern.compile("([a-z]+)(\\d+)"); 2 Matcher m=p.matcher("aaa2223bb"); 3 m.find(); //匹配aaa2223 4 m.groupCount(); //返回2,因為有2組 5 m.start(1); //返回0 返回第一組匹配到的子字元串在字元串中的索引號 6 m.start(2); //返回3 7 m.end(1); //返回3 返回第一組匹配到的子字元串的最後一個字元在字元串中的索引位置. 8 m.end(2); //返回7 9 m.group(1); //返回aaa,返回第一組匹配到的子字元串 10 m.group(2); //返回2223,返回第二組匹配到的子字元串
現在我們使用一下稍微高級點的正則匹配操作,例如有一段文本,裡面有很多數字,而且這些數字是分開的,我們現在要將文本中所有數字都取出來,利用java的正則操作是那麼的簡單.
1 Pattern p=Pattern.compile("\\d+"); 2 Matcher m=p.matcher("我的QQ是:456456 我的電話是:0532214 我的郵箱是:[email protected]"); 3 while(m.find()) { 4 System.out.println(m.group()); 5 }
輸出:
456456
0532214
123
如將以上while()迴圈替換成
1 while(m.find()) { 2 System.out.println(m.group()); 3 System.out.print("start:"+m.start()); 4 System.out.println(" end:"+m.end()); 5 }
則輸出:
456456
start:6 end:12
0532214
start:19 end:26
123
start:36 end:39
現在大家應該知道,每次執行匹配操作後start(),end(),group()三個方法的值都會改變,改變成匹配到的子字元串的信息,以及它們的重載方法,也會改變成相應的信息.
註意:只有當匹配操作成功,才可以使用start(),end(),group()三個方法,否則會拋出java.lang.IllegalStateException,也就是當matches(),lookingAt(),find()其中任意一個方法返回true時,才可以使用.