java.util.regex包下的Pattern和Matcher详解(正则匹配)
java正則表達式通過java.util.regex包下的Pattern類與Matcher類實現(xiàn)(建議在閱讀本文時,打開java API文檔,當(dāng)介紹到哪個方法時,查看java API中的方法說明,效果會更佳).?
Pattern類用于創(chuàng)建一個正則表達式,也可以說創(chuàng)建一個匹配模式,它的構(gòu)造方法是私有的,不可以直接創(chuàng)建,但可以通過?Pattern.complie(String regex)?簡單工廠方法創(chuàng)建一個正則表達式。?
Java代碼示例:?
compile(String regex) 將正則表達式編譯到Pattern中。該方法是個靜態(tài)方法;
pattern() 返回正則表達式的字符串形式,其實就是返回Pattern.complile(String regex)的regex參數(shù) ;
?
1.Pattern.split(CharSequence input)?
Pattern有一個split(CharSequence input)方法,用于分隔字符串,并返回一個String[],我猜String.split(String regex)就是通過Pattern.split(CharSequence input)來實現(xiàn)的;
Java代碼示例:?
結(jié)果:str[0]="我的姓名是:" str[1]="我的電話是:" str[2]="我的郵箱是:aaa@aaa.com"?
?
2.Pattern.matcher(String regex,CharSequence input)
Pattern.matcher(String regex,CharSequence input)是一個靜態(tài)方法,用于快速匹配字符串,該方法適合用于只匹配一次,且匹配全部字符串;
Java代碼示例:?
?
3.Pattern.matcher(CharSequence input)?
Pattern.matcher(CharSequence input)返回一個Matcher對象.?
Matcher類的構(gòu)造方法也是私有的,不能隨意創(chuàng)建,只能通過Pattern.matcher(CharSequence input)方法得到該類的實例.?
Pattern類只能做一些簡單的匹配操作,要想得到更強更便捷的正則匹配操作,那就需要將Pattern與Matcher一起合作.Matcher類提供了對正則表達式的分組支持,以及對正則表達式的多次匹配支持.?
Java代碼示例:?
?
4.Matcher.matches()
Matcher類提供三個匹配操作方法(Matcher.matches()/ Matcher.lookingAt()/ Matcher.find()?),三個方法均返回boolean類型,當(dāng)匹配到時返回true,沒匹配到則返回false?
matches()對整個字符串進行匹配,只有整個字符串都匹配了才返回true?
Java代碼示例:?
我們現(xiàn)在回頭看一下Pattern.matcher(String regex,CharSequence input),它與下面這段代碼等價?Pattern.compile(regex).matcher(input).matches()?
?
5.Matcher.lookingAt()
lookingAt()對前面的字符串進行匹配,只有匹配到的字符串在最前面才返回true?
Java代碼示例:?
?
6.Matcher.find()
find()對字符串進行匹配,匹配到的字符串可以在任何位置.?
Java代碼示例:?
?
7.Mathcer.start()/ Matcher.end()/ Matcher.group()?
當(dāng)使用matches(),lookingAt(),find()執(zhí)行匹配操作后,就可以利用以下三個方法得到更詳細的信息.?
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()只能匹配前面的字符串,所以當(dāng)使用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),里面有很多數(shù)字,而且這些數(shù)字是分開的,我們現(xiàn)在要將文本中所有數(shù)字都取出來,利用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?
?
? ?? ??總結(jié):? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
現(xiàn)在應(yīng)該知道,每次執(zhí)行匹配操作后start(),end(),group()三個方法的值都會改變,改變成匹配到的子字符串的信息,以及它們的重載方法,也會改變成相應(yīng)的信息.?
只有當(dāng)匹配操作成功,才可以使用start(),end(),group()三個方法,否則會拋出java.lang.IllegalStateException,也就是當(dāng)matches(),lookingAt(),find()其中任意一個方法返回true時,才可以使用.
Pattern與Matcher一起合作,Matcher類提供了對正則表達式的分組支持,以及對正則表達式的多次匹配支持.。單獨用Pattern只能使用Pattern.matcher(String regex,CharSequence input)一種最基礎(chǔ)最簡單的匹配。
Pattern.compile(regex).matcher(input).matches()
?
轉(zhuǎn)載于:https://www.cnblogs.com/tongxuping/p/7832895.html
總結(jié)
以上是生活随笔為你收集整理的java.util.regex包下的Pattern和Matcher详解(正则匹配)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [HDU 1427]速度计算24点(DF
- 下一篇: NET快速开发实践中的IExtender