![Pattern和Matcher_第1頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/23/485eec30-9a34-41d4-8a77-588237566689/485eec30-9a34-41d4-8a77-5882375666891.gif)
![Pattern和Matcher_第2頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/23/485eec30-9a34-41d4-8a77-588237566689/485eec30-9a34-41d4-8a77-5882375666892.gif)
![Pattern和Matcher_第3頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/23/485eec30-9a34-41d4-8a77-588237566689/485eec30-9a34-41d4-8a77-5882375666893.gif)
![Pattern和Matcher_第4頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/23/485eec30-9a34-41d4-8a77-588237566689/485eec30-9a34-41d4-8a77-5882375666894.gif)
![Pattern和Matcher_第5頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/23/485eec30-9a34-41d4-8a77-588237566689/485eec30-9a34-41d4-8a77-5882375666895.gif)
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、 java.util.regex是一個用正那么表達式所訂制的模式來對字符申進行匹配工作的類 庫包。 1. 簡介: java.util.regex是一個用正那么表達式所訂制的模式來對字符申進行匹配工作的類 庫包。 它包括兩個類:Pattern和Matcher Pattern 一個Pattern是一個正那么表達式經(jīng)編 譯后的表現(xiàn)模式。 Matcher 一個Matcher對象是一個狀態(tài)機器,它依據(jù) Pattern對象做為匹配模式 對字符申展開匹配檢查。 首先一個Pattern實例訂制了一個所用語法與PERL勺類似的正那么表達式經(jīng)編譯后 的模式,然后一個Matcher實例在這個給定的Pattern實例
2、的模式控制下進行字 符申的匹配工作。 以下我們就分別來看看這兩個類: 2. Pattern 類: Pattern 的方法如下: static Pattern compile(String regex) 將給定的正那么表達式編譯并賦予給 Pattern類 static Pattern compile(String regex, int flags) 同上,但增加flag參數(shù)的指定,可選的flag參數(shù)包括:CASE INSENSITIVE,MULTILINE,DOTALL,UNICODE,CACANON EQ int flags() 返回當前Pattern的匹配flag參數(shù). Matcher ma
3、tcher(CharSequence input) 生成一個給定命名的Matcher對象 staticboolean matches(String regex, CharSequence input) 編譯給定的正那么表達式并且對輸入的字申以該正那么表達式為模開展匹配 ,該方法 適合于該正那么表達式只會使用一次的情況, 也就是只進行一次匹配工作,因為這 種情況下并不需要生成一個Matcher實例。 String pattern() 返回該Patter對象所編譯的正那么表達式。 String split(CharSequence input) 將目標字符申按照Pattern里所包含的正那么表達式
4、為模進行分割。 String split(CharSequence input, int limit) 作用同上,增加參數(shù)limit目的在于要指定分割的段數(shù),如將limi設(shè)為2,那么目 標字符申將根據(jù)正那么表達式分為割為兩段。 一個正那么表達式,也就是一申有特定意義的字符,必須首先要編譯成為一個 Pattern類的實例,這個 Pattern對象將會使用 matcher()方法來生成一個 Matcher 實例,接著便可以使用該 Matcher實例以編譯的正那么表達式為根底對目標字符 申進行匹配工作,多個 Matcher是可以共用一個Pattern對象的。 現(xiàn)在我們先來看一個簡單的例子,再通過分析
5、它來了解怎樣生成一個 Pattern對 象并且編譯一個正那么表達式,最后根據(jù)這個正那么表達式將目標字符申進行分割: 復(fù)制代碼代碼如下: importjava.util.regex.*; public class Replacement( public static void main(String args) throws Exception ( /生成一個Pattern,同時編譯一個正那么表達式 Pattern p = Pattern pile(/+); /用Pattern的split()方法把字符申按/分割 String result = p.split( Kevin has seen?L
6、EONsevealtimes,because it is a good film. +/凱文已經(jīng)看過?這個殺手不太冷?幾次了,因為它是一部 +好電影。/名詞:凱文。); for (int i=0; iresult.length; i+) System.out.println(resulti); 輸出結(jié)果為: Kevin has seen?LEONsevealtimes,because it is a good film. 凱文已經(jīng)看過?這個殺手不太冷?幾次了,因為它是一部好電影。 名詞:凱文。 很明顯,該程序?qū)⒆址臧?進行了分段,我們以下再使用 split(CharSequence inpu
7、t, int limit)方法來指定分段的段數(shù),程序改動為: tring result = p.split(Kevin has seen?LEONsevealtimes,because it is a good film./ 凱文已經(jīng)看過?這個殺手不太冷?幾次了,因為它是一部好電影。 /名詞:凱文。 ,2); 這里面的參數(shù)2說明將目標語句分為兩段。 輸出結(jié)果那么為: Kevin has seen?LEONsevealtimes,because it is a good film. 凱文已經(jīng)看過?這個殺手不太冷?幾次了,因為它是一部好電影。 /名詞:凱文。 由上面的例子,我們可以比擬出java.
8、util.regex包在構(gòu)造Pattern對象以及編譯指 定的正那么表達式的實現(xiàn)手法與我們在上一篇中所介紹的 Jakarta-OR O包在完成 同樣工作時的差異,Jakarta-ORO包要先構(gòu)造一個 PatternCompiler類對象接著生 成一個Pattern對象,再將正那么表達式用該 PatternCompiler類的compile()方法來 將所需的正那么表達式編譯賦予 Pattern類: PatternCompilerorocom=new Perl5Compiler(); Pattern pattern=orocom pile(REGULAR EXPRESSIONS); Patter
9、nMatcher matcher=new Perl5Matcher(); 但是在java.util.regex包里,我們僅需生成一個Pattern類,直接使用它的compile() 方法就可以到達同樣的效果: Pattern p = Pattern pile(/+); 因此似乎java.util.regex的構(gòu)造法比Jakarta-ORC為簡潔并容易理解。 3. Matcher 類: Matcher 方法如下: Matcher appendReplacement(StringBuffersb, String replacement) 將當前匹配子申替換為指定字符申,并且將替換后的子申以及其之前
10、到上次匹配 子申之后的字符申段添加到一個 StringBuffer對象里。 StringBufferappendTail(StringBuffersb) 將最后一次匹配工作后剩余的字符申添加到一個 StringBuffer對象里。 int end() 返回當前匹配的子申的最后一個字符在原目標字符申中的索引位置。 int end(int group) 返回與匹配模式里指定的組相匹配的子申最后一個字符的位置。 boolean find() 嘗試在目標字符申里查找下一個匹配子申。 boolean find(int start) 重設(shè)Matcher對象,并且嘗試在目標字符申里從指定的位置開始查找下一個
11、匹配 的子申。 String group() 返回當前查彼而獲得的與組匹配的所有子申內(nèi)容 String group(int group) 返回當前查找而獲得的與指定的組匹配的子申內(nèi)容 intgroupCount() 返回當前查找所獲得的匹配組的數(shù)量。 booleanlookingAt() 檢測目標字符申是否以匹配的子申起始。 boolean matches() 嘗試對整個目標字符展開匹配檢測,也就是只有整個目標字符申完全匹配時才返 回真值。 Pattern pattern() 返回該Matcher對象的現(xiàn)有匹配模式,也就是對應(yīng)的 Pattern對象。 String replaceAll(Str
12、ing replacement) 將目標字符申里與既有模式相匹配的子申全部替換為指定的字符申。 String replaceFirst(String replacement) 將目標字符申里第一個與既有模式相匹配的子申替換為指定的字符申。 Matcher reset() 重設(shè)該Matcher對象。 Matcher reset(CharSequence input) 重設(shè)該Matcher對象并且指定一個新的目標字符申。 int start() 返回當前查找所獲子申的開始字符在原目標字符申中的位置。 int start(int group) 返回當前查找所獲得的和指定組匹配的子申的第一個字符在原目
13、標字符申中的 位置。 (光看方法的解釋是不是很不好理解?不要急, 待會結(jié)合例子就比擬容易明白了) 一個Matcher實例是被用來對目標字符申進行基于既有模式 (也就是一個給定的 Pattern所編譯的正那么表達式)進行匹配查找的,所有往 Matcher的輸入都是通 過CharSequence接口提供的,這樣做的目的在于可以支持對從多元化的數(shù)據(jù)源 所提供的數(shù)據(jù)進行匹配工作。 我們分別來看看各方法的使用: matches()/lookingAt ()/find(): 一個Matcher對象是由一個Pattern對象調(diào)用其 matcher()方法而生成的,一旦該 Matcher對象生成,它就可以進行
14、三種不同的匹配查找操作: matches。方法嘗試對整個目標字符展開匹配檢測, 也就是只有整個目標字符申完 全匹配時才返回真值。 lookingAt ()方法將檢測目標字符申是否以匹配的子申起始。 find()方法嘗試在目標字符申里查找下一個匹配子申。 以上三個方法都將返回一個布爾值來說明成功與否。 replaceAll ()/appendReplacement()/appendTail() Matcher類同時提供了四個將匹配子申替換成指定字符申的方法: replaceAll() replaceFirst() appendReplacement() appendTail() replaceA
15、ll(力replaceFirst()的用法都比擬簡單,請看上面方法的解釋。我們主要 重點了解一下 appendReplacement(B appendTail()?!r法。 appendReplacement(StringBuffersb, String replacement)將當前匹配子申替換為指 定字符申,并且將替換后的子申以及其之前到上次匹配子申之后的字符申段添加 到一個StringBuffer對象里,而appendTail(StringBuffersb)方法那么將最后一次匹配 工作后剩余的字符申添加到一個 StringBuffer對象里。 例如,有字符申fatcatfatcatfat
16、,假設(shè)既有正那么表達式模式為cat,第一次匹配后 調(diào)用 appendReplacement(sb,dog)那么這時 StringBuffersb 的內(nèi)容為 fatdog,也 就是fatcat中的cat被替換為dog并且與匹配子申前的內(nèi)容加到 sb里,而第二次 匹配后調(diào)用 appendReplacement(sb,dog),那么 sb 的內(nèi)容就變?yōu)?fatdogfatdog, 如果最后再調(diào)用一次 叩pendTail (sb),那么sb最終的內(nèi)容將是fatdogfatdogfat。 還是有點模糊?那么我們來看個簡單的程序: /該例將把句子里的Kelvin改為Kevin importjava.uti
17、l.regex.*; public class MatcherTest( public static void main(String args) throws Exception ( 生成Pattern對象并且編譯一個簡單的正那么表達式Kelvin Pattern p = Pattern pile(Kevin); /用Pattern類的matcher()方法生成一個 Matcher對象 Matcher m = p.matcher(Kelvin Li and Kelvin Chan are both working in Kelvin Chens KelvinSoftShop company)
18、; StringBuffersb = new StringBuffer(); int i=0; 使用find()方法查找第一個匹配的對象 boolean result = m.find(); /使用循環(huán)將句子里所*的kelvin找出并替換再將內(nèi)容加到sb里 while(result) ( i+; m.appendReplacement(sb, Kevin); System.out.println(第+i+次匹配后 sb 的內(nèi)容是:+sb); /繼續(xù)查找下一個匹配對象 result = m.find(); /最后調(diào)用appendTail(府法將最后一次匹配后的剩余字符申加到 sb里; m.app
19、endTail(sb); System.out.println(調(diào)用 m.appendTail(sb后 sb 的最終內(nèi)容是:+ sb.toString(); 最終輸出結(jié)果為: 第1次匹配后sb的內(nèi)容是:Kevin 第2次匹配后sb的內(nèi)容是:Kevin Li and Kevin 第 3 次匹配后 sb 的內(nèi)容是:Kevin Li and Kevin Chan are both working in Kevin 第 4 次匹配后 sb 的內(nèi)容是:Kevin Li and Kevin Chan are both working in Kevin Chens Kevin 調(diào)用 m.appendTail
20、(sb后 sb 的最終內(nèi)容是:Kevin Li and Kevin Chan are both working in Kevin Chens KevinSoftShopcompany. 看了上面這個例程是否對 appendReplacement(), appendTail(洌個方法的使用更 活楚呢,如果還是不太肯定最好自己動手寫幾行代碼測試一下。 group()/group(int group)/groupCount(): 該系歹0方法與我們在上篇介紹的 Jakarta-ORW的MatchResult .group()方法類似 (有關(guān)Jakarta-ORO請參考上篇的內(nèi)容),都是要返回與組匹配
21、的子申內(nèi)容,下面 代碼將很好解釋其用法: importjava.util.regex.*; public class GroupTest public static void main(String args) throws Exception Pattern p = Pattern pile(ca)(t); Matcher m = p.matcher(one cat,two cats in the yard); StringBuffersb = new StringBuffer(); boolean result = m.find(); System.out.println(該次查找獲得匹配
22、組的數(shù)量為:+m.groupCount(); for(int i=1;i=m 輸出為: 該次查找獲得匹配組的數(shù)量為:2 第1組的子申內(nèi)容為:ca 第2組的子申內(nèi)容為:t Matcher對象的其他方法因比擬好理解且由于篇幅有限,請讀者自己編程驗證。 4.一個檢驗Email地址的小程序: 最后我們來看一個檢驗Email地址的例程,該程序是用來檢驗一個輸入的 EMAIL 地址里所包含的字符是否合法,雖然這不是一個完整的EMAI L地址檢驗程序,它 不能檢驗所有可能出現(xiàn)的情況,但在必要時您可以在其根底上增加所需功能。 importjava.util.regex.*; public class Emai
23、l public static void main(String args) throws Exception ( String input = args0; 檢測輸入的EMAIL地址是否以非法符號.或作為起始字符 Pattern p = Pattern pile(A.|A); Matcher m = p.matcher(input); if (m 檢測是否以 為起始 p = Pattern pile(A ); m = p.matcher(input); if (m /檢測是否包含非法字符 p = Pattern pile(AA-Za-z0-9._-#+); m = p.matcher(input); StringBuffe
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年八年級物理下冊 第7章 第2節(jié) 彈力說課稿 (新版)新人教版
- 2025最簡單采購合同協(xié)議樣本
- 2024-2025學年高中化學 第1章 有機化合物的結(jié)構(gòu)與性質(zhì) 烴 1.1.1 有機化學的發(fā)展 有機化合物的分類說課稿 魯科版選修5
- 2025如何防范國際貿(mào)易合同中的風險店鋪轉(zhuǎn)讓合同協(xié)議書
- 農(nóng)村電商 合同范例
- 包裝食品采購合同范例
- Unit 1 My school 單元整體分析(說課稿)-2023-2024學年人教PEP版英語四年級下冊
- 2024-2025學年高中歷史 專題九 戊戌變法 一 醞釀中的變革(2)教學說課稿 人民版選修1
- 13 導(dǎo)體和絕緣體 說課稿-2024-2025學年科學四年級上冊蘇教版001
- JN造船廠合同管理改進研究
- 青島中國(山東)自由貿(mào)易試驗區(qū)青島片區(qū)(青島前灣綜合保稅區(qū))管理委員會選聘35人筆試歷年參考題庫附帶答案詳解
- 教育信息化背景下的學術(shù)研究趨勢
- 人教版小學數(shù)學(2024)一年級下冊第五單元100以內(nèi)的筆算加、減法綜合素養(yǎng)測評 B卷(含答案)
- GB/T 7462-1994表面活性劑發(fā)泡力的測定改進Ross-Miles法
- GB/T 2934-2007聯(lián)運通用平托盤主要尺寸及公差
- GB/T 21709.13-2013針灸技術(shù)操作規(guī)范第13部分:芒針
- 2022年青島職業(yè)技術(shù)學院單招語文考試試題及答案解析
- 急診科進修匯報課件
- 一年級家訪記錄表(常用)
- 信息技術(shù)基礎(chǔ)ppt課件(完整版)
- 電子課件-《飯店服務(wù)心理(第四版)》-A11-2549
評論
0/150
提交評論