Java 正則表達(dá)式學(xué)習(xí)總結(jié)和一些小例子
從Java1.4起,Java核心API就引入了java.util.regex程序包,它是一種有價(jià)值的基礎(chǔ)工具,可以用于很多類(lèi)型的文本處理, 如匹配,搜索,提取和分析結(jié)構(gòu)化內(nèi)容.
java.util.regex是一個(gè)用正則表達(dá)式所訂制的模式來(lái)對(duì)字符串進(jìn)行匹配工作的類(lèi)庫(kù)包。它包括兩個(gè)類(lèi):Pattern和Matcher.
Pattern是一個(gè)正則表達(dá)式經(jīng)編譯后的表現(xiàn)模式。 在java中,通過(guò)適當(dāng)命名的Pattern類(lèi)可以容易確定String是否匹配某種模式.模式可以象匹配某個(gè)特定的String那樣簡(jiǎn)單,也可以很復(fù) 雜,需要采用分組和字符類(lèi),如空白,數(shù)字,字母或控制符.因?yàn)镴ava字符串基于統(tǒng)一字符編碼(Unicode),正則表達(dá)式也適用于國(guó)際化的應(yīng)用程序.
Pattern類(lèi)的方法簡(jiǎn)述
方法 | 說(shuō)明 |
static Pettern compile(String regex,int flag) | 編譯模式,參數(shù)regex表示輸入的正則表達(dá)式,flag表示模式類(lèi)型(Pattern.CASE_INSENSITIVE 表示不區(qū)分大小寫(xiě)) |
Matcher match(CharSequence input) | 獲取匹配器,input時(shí)輸入的待處理的字符串 |
static boolean matches(String regex, CharSequence input) | 快速的匹配調(diào)用,直接根據(jù)輸入的模式regex匹配input |
String[] split(CharSequence input,int limit) | 分隔字符串input,limit參數(shù)可以限制分隔的次數(shù) |
Matcher 一個(gè)Matcher對(duì)象是一個(gè)狀態(tài)機(jī)器,它依據(jù)Pattern對(duì)象做為匹配模式對(duì)字符串展開(kāi)匹配檢查。首先一個(gè)Pattern實(shí)例訂制了一個(gè)所用語(yǔ)法與 PERL的類(lèi)似的正則表達(dá)式經(jīng)編譯后的模式,然后一個(gè)Matcher實(shí)例在這個(gè)給定的Pattern實(shí)例的模式控制下進(jìn)行字符串的匹配工作。
Matcher類(lèi)的方法簡(jiǎn)述
方法 | 說(shuō)明 |
boolean matches() | 對(duì)整個(gè)輸入字符串進(jìn)行模式匹配. |
boolean lookingAt() | 從輸入字符串的開(kāi)始處進(jìn)行模式匹配 |
boolean find(int start) | 從start處開(kāi)始匹配模式 |
int groupCount() | 返回匹配后的分組數(shù)目 |
|
用給定的replacement全部替代匹配的部分 |
String repalceFirst(String replacement) | 用給定的replacement替代第一次匹配的部分 |
Matcher appendReplacement(StringBuffer sb,String replacement) | 根據(jù)模式用replacement替換相應(yīng)內(nèi)容,并將匹配的結(jié)果添加到sb當(dāng)前位置之后 |
StringBuffer appendTail(StringBuffer sb) | 將輸入序列中匹配之后的末尾字串添加到sb當(dāng)前位置之后. |
正則表達(dá)式中常見(jiàn)通配符:
對(duì)于單字符串比較而言,使用正則表達(dá)式?jīng)]有什么優(yōu)勢(shì).Regex的真正強(qiáng)大之處在于體現(xiàn)在包括字符類(lèi)和量詞(*,+,?)的更復(fù)雜的模式上.
字符類(lèi)包括:
\d 數(shù)字
\D 非數(shù)字
\w 單字字符(0-9,A-Z,a-z)
\W 非單字字符
\s 空白(空格符,換行符,回車(chē)符,制表符)
\S 非空白
[] 由方括號(hào)內(nèi)的一個(gè)字符列表創(chuàng)建的自定義字符類(lèi)
. 匹配任何單個(gè)字符
下面的字符將用于控制將一個(gè)子模式應(yīng)用到匹配次數(shù)的過(guò)程.
? 重復(fù)前面的子模式0次到一次
* 重復(fù)前面的子模式0次或多次
+ 重復(fù)前面的子模式一次到多次
以下是實(shí)例部分:
實(shí)例一:
正則式是最簡(jiǎn)單的能準(zhǔn)確匹配一個(gè)給定String的模式,模式與要匹配的文本是等價(jià)的.靜態(tài)的Pattern.matches方法用于比較一個(gè)String是否匹配一個(gè)給定模式.例程如下:
String data="java"; boolean result=Pattern.matches("java",data);
實(shí)例二:
String[] dataArr = { "moon", "mon", "moon", "mono" }; for (String str : dataArr) { String patternStr="m(o+)n"; boolean result = Pattern.matches(patternStr, str); if (result) { System.out.println("字符串"+str+"匹配模式"+patternStr+"成功"); } else{ System.out.println("字符串"+str+"匹配模式"+patternStr+"失敗"); } }
模式是”m(o+)n”,它表示mn中間的o可以重復(fù)一次或多次,因此moon,mon,mooon能匹配成功,而mono在n后多了一個(gè)o,和模式匹配不上.
注:
+表示一次或多次;?表示0次或一次;*表示0次或多次.
實(shí)例三:
String[] dataArr = { "ban", "ben", "bin", "bon" ,"bun","byn","baen"}; for (String str : dataArr) { String patternStr="b[aeiou]n"; boolean result = Pattern.matches(patternStr, str); if (result) { System.out.println("字符串"+str+"匹配模式"+patternStr+"成功"); } else{ System.out.println("字符串"+str+"匹配模式"+patternStr+"失敗"); } }
注:方括號(hào)中只允許的單個(gè)字符,模式“b[aeiou]n”指定,只有以b開(kāi)頭,n結(jié)尾,中間是a,e,i,o,u中任意一個(gè)的才能匹配上,所以數(shù)組的前五個(gè)可以匹配,后兩個(gè)元素?zé)o法匹配.
方括號(hào)[]表示只有其中指定的字符才能匹配.
實(shí)例四:
String[] dataArr = { "been", "bean", "boon", "buin" ,"bynn"}; for (String str : dataArr) { String patternStr="b(ee|ea|oo)n"; boolean result = Pattern.matches(patternStr, str); if (result) { System.out.println("字符串"+str+"匹配模式"+patternStr+"成功"); } else{ System.out.println("字符串"+str+"匹配模式"+patternStr+"失敗"); } }
如果需要匹配多個(gè)字符,那么[]就不能用上了,這里我們可以用()加上|來(lái)代替,()表示一組,|表示或的關(guān)系,模式b(ee|ea|oo)n就能匹配been,bean,boon等.
因此前三個(gè)能匹配上,而后兩個(gè)不能.
實(shí)例五:
String[] dataArr = { "1", "10", "101", "1010" ,"100+"}; for (String str : dataArr) { String patternStr="\d+"; boolean result = Pattern.matches(patternStr, str); if (result) { System.out.println("字符串"+str+"匹配模式"+patternStr+"成功"); } else{ System.out.println("字符串"+str+"匹配模式"+patternStr+"失敗"); } }
注:從前面可以知道,\d表示的是數(shù)字,而+表示一次或多次,所以模式\d+就表示一位或多位數(shù)字.
因此前四個(gè)能匹配上,最后一個(gè)因?yàn)?號(hào)是非數(shù)字字符而匹配不上.
實(shí)例六:
String[] dataArr = { "a100", "b20", "c30", "df10000" ,"gh0t"}; for (String str : dataArr) { String patternStr="\w+\d+"; boolean result = Pattern.matches(patternStr, str); if (result) { System.out.println("字符串"+str+"匹配模式"+patternStr+"成功"); } else{ System.out.println("字符串"+str+"匹配模式"+patternStr+"失敗"); } }
模式\w+\d+表示的是以多個(gè)單字字符開(kāi)頭,多個(gè)數(shù)字結(jié)尾的字符串,因此前四個(gè)能匹配上,最后一個(gè)因?yàn)閿?shù)字后還含有單字字符而不能匹配.
實(shí)例七:
String str="薪水,職位 姓名;年齡 性別"; String[] dataArr =str.split("[,\s;]"); for (String strTmp : dataArr) { System.out.println(strTmp); }
String類(lèi)的split函數(shù)支持正則表達(dá)式,上例中模式能匹配”,”,單個(gè)空格,”;”中的一個(gè),split函數(shù)能把它們中任意一個(gè)當(dāng)作分隔符,將一個(gè)字符串劈分成字符串?dāng)?shù)組.
實(shí)例八:
String str="2007年12月11日"; Pattern p = Pattern.compile("[年月日]"); String[] dataArr =p.split(str); for (String strTmp : dataArr) { System.out.println(strTmp); }
Pattern是一個(gè)正則表達(dá)式經(jīng)編譯后的表現(xiàn)模式 ,它的split方法能有效劈分字符串.
注意其和String.split()使用上的不同.
實(shí)例九:
String str="10元 1000人民幣 10000元 100000RMB"; str=str.replaceAll("(\d+)(元|人民幣|RMB)", "¥"); System.out.println(str);
上例中,模式“(\d+)(元|人民幣|RMB)”按括號(hào)分成了兩組,第一組\d+匹配單個(gè)或多個(gè)數(shù)字,第二組匹配元,人民幣,RMB中的任意一個(gè),替換部分表示第一個(gè)組匹配的部分不變,其余組替換成¥.
替換后的str為¥10 ¥1000 ¥10000 ¥100000
實(shí)例十:
Pattern p = Pattern.compile("m(o+)n",Pattern.CASE_INSENSITIVE); // 用Pattern類(lèi)的matcher()方法生成一個(gè)Matcher對(duì)象 Matcher m = p.matcher("moon mooon Mon mooooon Mooon"); StringBuffer sb = new StringBuffer(); // 使用find()方法查找第一個(gè)匹配的對(duì)象 boolean result = m.find(); // 使用循環(huán)找出模式匹配的內(nèi)容替換之,再將內(nèi)容加到sb里 while (result) { m.appendReplacement(sb, "moon"); result = m.find(); } // 最后調(diào)用appendTail()方法將最后一次匹配后的剩余字符串加到sb里; m.appendTail(sb); System.out.println("替換后內(nèi)容是" + sb.toString());
實(shí)例十一:
除了用+表示一次或多次,*表示0次或多次,?表示0次或一次外,還可以用{}來(lái)指定精確指定出現(xiàn)的次數(shù),X{2,5}表示X最少出現(xiàn)2次,最多出現(xiàn)5次;X{2,}表示X最少出現(xiàn)2次,多則不限;X{5}表示X只精確的出現(xiàn)5次.
例程:
String[] dataArr = { "google", "gooogle", "gooooogle", "goooooogle","ggle"}; for (String str : dataArr) { String patternStr = "g(o{2,5})gle"; boolean result = Pattern.matches(patternStr, str); if (result) { System.out.println("字符串" + str + "匹配模式" + patternStr + "成功"); } else { System.out.println("字符串" + str + "匹配模式" + patternStr + "失敗"); } }
實(shí)例十二:
-表示從..到…,如[a-e]等同于[abcde]
String[] dataArr = { "Tan", "Tbn", "Tcn", "Ton","Twn"}; for (String str : dataArr) { String regex = "T[a-c]n"; boolean result = Pattern.matches(regex, str); if (result) { System.out.println("字符串" + str + "匹配模式" + regex + "成功"); } else { System.out.println("字符串" + str + "匹配模式" + regex + "失敗"); } }
實(shí)例十三:不區(qū)分大小寫(xiě)匹配.
正則表達(dá)式默認(rèn)都是區(qū)分大小寫(xiě)的,使用了Pattern.CASE_INSENSITIVE則不對(duì)大小寫(xiě)進(jìn)行區(qū)分.
String patternStr="ab"; Pattern pattern=Pattern.compile(patternStr, Pattern.CASE_INSENSITIVE); String[] dataArr = { "ab", "Ab", "AB"}; for (String str : dataArr) { Matcher matcher=pattern.matcher(str); if(matcher.find()){ System.out.println("字符串" + str + "匹配模式" + patternStr + "成功"); } }
實(shí)例十四:使用正則表達(dá)式劈分字符串.
注意這里要把復(fù)雜的模式寫(xiě)在前面,否則簡(jiǎn)單模式會(huì)先匹配上.
String input="職務(wù)=GM 薪水=50000 , 姓名=職業(yè)經(jīng)理人 ; 性別=男 年齡=45 "; String patternStr="(\s*,\s*)|(\s*;\s*)|(\s+)"; Pattern pattern=Pattern.compile(patternStr); String[] dataArr=pattern.split(input); for (String str : dataArr) { System.out.println(str); }
實(shí)例十五:解析正則表達(dá)式中的文字,對(duì)應(yīng)第一個(gè)小括號(hào)括起來(lái)的group1.
String regex="<(\w+)>(\w+)</>"; Pattern pattern=Pattern.compile(regex); String input="<name>Bill</name><salary>50000</salary><title>GM</title>"; Matcher matcher=pattern.matcher(input); while(matcher.find()){ System.out.println(matcher.group(2)); }
實(shí)例十六:將單詞數(shù)字混合的字符串的單詞部分大寫(xiě).
String regex="([a-zA-Z]+[0-9]+)"; Pattern pattern=Pattern.compile(regex); String input="age45 salary500000 50000 title"; Matcher matcher=pattern.matcher(input); StringBuffer sb=new StringBuffer(); while(matcher.find()){ String replacement=matcher.group(1).toUpperCase(); matcher.appendReplacement(sb, replacement); } matcher.appendTail(sb); System.out.println("替換完的字串為"+sb.toString());
這篇文章到這就結(jié)束了。
相關(guān)文章
JS實(shí)現(xiàn)標(biāo)簽頁(yè)效果(配合css)
實(shí)現(xiàn)的效果是當(dāng)鼠標(biāo)移到某一個(gè)標(biāo)簽的時(shí)候,在下面的內(nèi)容區(qū)顯示對(duì)應(yīng)的內(nèi)容,并且相應(yīng)標(biāo)簽的顏色需要改變,這樣的效果是CSS和JS配合實(shí)現(xiàn)的,下面我們就來(lái)看看具體代碼2013-04-04bootstrap是什么_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了bootstrap是什么,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07詳解Webpack + ES6 最新環(huán)境搭建與配置
這篇文章主要介紹了詳解Webpack + ES6 最新環(huán)境搭建與配置,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06為網(wǎng)站代碼塊pre標(biāo)簽增加一個(gè)復(fù)制代碼按鈕代碼
寫(xiě)文章的時(shí)候,作為一名專(zhuān)業(yè)的碼農(nóng),經(jīng)常會(huì)在文章中粘貼一些代碼。有的時(shí)候代碼塊比較長(zhǎng),在后期使用中需要復(fù)制這段代碼就比較麻煩2021-11-11js寫(xiě)的方法實(shí)現(xiàn)上傳圖片之后查看大圖
用js寫(xiě)了一個(gè)方法,然后在image的onmouseover事件中調(diào)用此方法,這樣在鼠標(biāo)懸浮在小圖上面的時(shí)候,其大圖就會(huì)自動(dòng)的顯示出來(lái)2014-03-03axios實(shí)現(xiàn)簡(jiǎn)單文件上傳功能
這篇文章主要為大家詳細(xì)介紹了axios實(shí)現(xiàn)簡(jiǎn)單文件上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09JavaScript常見(jiàn)的函數(shù)中的屬性與方法總結(jié)
當(dāng)定義和調(diào)用函數(shù)時(shí),JavaScript?函數(shù)對(duì)象會(huì)自動(dòng)具有一些特定的屬性,本文為大家總結(jié)了一些常見(jiàn)的屬性和方法,感興趣的小伙伴可以了解一下2023-05-05innerText和innerHTML 一些問(wèn)題分析
盡管DOM帶來(lái)了動(dòng)態(tài)修改文檔的能力,但對(duì)開(kāi)發(fā)人員來(lái)說(shuō),這還不夠。IE4.0為所有的元素引入了兩個(gè)特性,以更方便的進(jìn)行文檔操作,這兩個(gè)特性是innerText和innerHTML。2009-05-05JavaScript模擬實(shí)現(xiàn)簡(jiǎn)單的MVC的示例詳解
MVC是一種常見(jiàn)的軟件架構(gòu)模式,MVC模式的目的是將應(yīng)用程序的數(shù)據(jù)、用戶(hù)界面和控制邏輯分離,提高代碼的可維護(hù)性,可拓展性和可重用性。本文就來(lái)用用JS模擬實(shí)現(xiàn)一個(gè)簡(jiǎn)單的MVC吧2023-04-04