1. 程式人生 > >JAVA正則表示式:Pattern類與Matcher類詳解(轉)

JAVA正則表示式:Pattern類與Matcher類詳解(轉)

java.util.regex是一個用正則表示式所訂製的模式來對字串進行匹配工作的類庫包。它包括兩個類:Pattern和Matcher Pattern 一個Pattern是一個正則表示式經編譯後的表現模式。 Matcher 一個Matcher物件是一個狀態機器,它依據Pattern物件做為匹配模式對字串展開匹配檢查。 首先一個Pattern例項訂製了一個所用語法與PERL的類似的正則表示式經編譯後的模式,然後一個Matcher例項在這個給定的Pattern例項的模式控制下進行字串的匹配工作。

以下我們就分別來看看這兩個類:

一、捕獲組的概念

捕獲組可以通過從左到右計算其開括號來編號,編號是從1 開始的。例如,在表示式 ((A)(B(C)))中,存在四個這樣的組:

1        ((A)(B(C)))
2        (A)
3        (B(C))
4        (C)

組零始終代表整個表示式。 以 (?) 開頭的組是純的非捕獲 組,它不捕獲文字,也不針對組合計進行計數。

與組關聯的捕獲輸入始終是與組最近匹配的子序列。如果由於量化的緣故再次計算了組,則在第二次計算失敗時將保留其以前捕獲的值(如果有的話)例如,將字串"aba" 與表示式(a(b)?)+ 相匹配,會將第二組設定為 "b"。在每個匹配的開頭,所有捕獲的輸入都會被丟棄。


二、詳解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+ 

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 
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() 

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 

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 

5.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=m.matcher("2223bb"); 
m.lookingAt();   //匹配2223 
m.start();   //返回0,由於lookingAt()只能匹配前面的字串,所以當使用lookingAt()匹配時,start()方法總是返回0 
m.end();   //返回4 
m.group();   //返回2223 

Matcher m3=m.matcher("2223bb"); 
m.matches();   //匹配整個字串 
m.start();   //返回0,原因相信大家也清楚了 
m.end();   //返回6,原因相信大家也清楚了,因為matches()需要匹配所有字串 
m.group();   //返回2223bb 

說了這麼多,相信大家都明白了以上幾個方法的使用,該說說正則表示式的分組在java中是怎麼使用的. 
start(),end(),group()均有一個過載方法它們是start(int i),end(int i),group(int i)專用於分組操作,Mathcer類還有一個groupCount()用於返回有多少組. 
Java程式碼示例: 

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,返回第二組匹配到的子字串 

現在我們使用一下稍微高階點的正則匹配操作,例如有一段文字,裡面有很多數字,而且這些數字是分開的,我們現在要將文字中所有數字都取出來,利用java的正則操作是那麼的簡單. 
Java程式碼示例: 

Pattern p=Pattern.compile("\\d+"); 
Matcher m=p.matcher("我的QQ是:456456 我的電話是:0532214 我的郵箱是:[email protected]"); 
while(m.find()) { 
     System.out.println(m.group()); 
} 

輸出: 

456456 
0532214 
123 

如將以上while()迴圈替換成 

while(m.find()) { 
     System.out.println(m.group()); 
     System.out.print("start:"+m.start()); 
     System.out.println(" end:"+m.end()); 
} 

則輸出: 

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時,才可以使用.

相關推薦

JAVA表示式PatternMatcher

java.util.regex是一個用正則表示式所訂製的模式來對字串進行匹配工作的類庫包。它包括兩個類:Pattern和Matcher Pattern 一個Pattern是一個正則表示式經編譯後的表現模式。 Matcher 一個Matcher物件是一個狀態機器,它依據Pattern物件做為匹

JAVA表示式PatternMatcher()

java.util.regex是一個用正則表示式所訂製的模式來對字串進行匹配工作的類庫包。它包括兩個類:Pattern和Matcher Pattern 一個Pattern是一個正則表示式經編譯後的表現模式。 Matcher 一個Matcher物件是一個狀態機器,它依據Pattern物件做為匹配模式對字串展開匹

JAVA表示式高階用法(分組捕獲)

 正則表示式在字串處理中經常使用,關於正則簡單的用法相信有一點程式基礎的人都懂得一些,這裡就不介紹簡單基礎了。這裡主要講解一下在JAVA中實現了的正則的高階用法-分組與捕獲。     對於要重複單個字元,非常簡單,直接在字元後賣弄加上限定符即可,例如 a+ 表示匹配1個或

java表示式之捕獲分組Back引用

一.捕獲分組 java正則表示式中以()括起來的內容表示一個分組,像((A)(B(C)))這個表示式中,共存在四個分組: 1.ABC 2.A 3.BC 4.C 很容易發現,分組是按照左邊的括號出現的順序來標號的 這就是捕獲分組 二.Back引用 我們以下面這個正則表示式為例

Java表示式讓分組group()代替replaceAll吧!

今天,在論壇回覆貼子時,無意中進一步學到了分組的用法。 在之前幾個抓取網頁並分析獲得標題和超連結的時候,為了去除標題和超連結中多餘的字串,我都是使用 String方法中的replaceAll. 現在掌握了這個分組,完全可以在獲取所需內容時就遮蔽了多餘的字串。 下面用例子說話吧

表示式必須牢記的幾個元字元java使用例項)

正則表示式元字元 1、常用元字元 . 表示除了換行符之外任意一個字元 \s 空格字元(空格鍵、tab、換行、回車) \S 非空格字元([^\s]) \d 一個數字,(相當於[0-9]) \D 一個非數字的字元,(相當於[^0-9])

java表示式PatternMatcher小結

  最近在實際開發中遇到了2個坑,都和正則表示式有關。一個是public String[] split(String regex),入參居然是正則表示式!!!另一個坑與Pattern、Matcher類的操作有關。都是對java的正則表示式不夠熟悉導致。特地整理一

Java表達式PatternMatcher

false lines round 表達 -a 嘗試 cas target 大小 轉載自--小魚兒是壞蛋(原文鏈接) 概述 Pattern類的作用在於編譯正則表達式後創建一個匹配模式. Matcher類使用Pattern實例提供的模式信息對正則表達式進行匹配

JS表示式量詞的貪婪模式惰性模式的區別

在說明貪婪模式與惰性模式區別之前,說明一下JS正則基礎: 1.寫法法基礎: regexObj.test(str);例如/123/.test(‘123’); 2.基本語法 錨點:匹配一個位置 ^表示起始位置;/^a/.test(‘str’);表示是否以a開頭

表示式PatternMatcher

正則表示式: 概念:正確規則的表示式 規則java給我們定的,是指一個用來描述或者匹配一系列符合某個句法規則的字串的單個字串。其實就是一種規則。有自己特殊的應用。 正則表示式的組成規則 規則字元在java.util.regex Pattern類中 A:字元 x 字元 x。舉例:‘

java手機號碼表示式

/** 驗證手機號碼: 移動號碼段:139、138、137、136、135、134、150、151、152、157、158、159、182、183、187、188、147 聯通號碼段:130、131、132、136、185、186、145 電訊號碼段:133、153、180、1

表示式PatternMatcher和matches()方法簡析

1.簡介:  java.util.regex是一個用正則表示式所訂製的模式來對字串進行匹配工作的類庫包。  它包括兩個類:Pattern和Matcher 。 Pattern: 一個Pattern是一個正則表示式經編譯後的表現模式。  Matcher: 一個Matcher物件

Java表示式學習記錄

轉載自:http://www.runoob.com/java/java-regular-expressions.html 正則表示式定義了字串的模式,用於搜尋、編輯或處理文字。 1、正則表示式中字元意義: \            將下一字元標

表示式PatternMatcher、Math、Random、System、BigDecimal、Date、SimpleDateFormat、Calendar

1.正則表示式 即給定的一個用來描述符合一定規則的字串的單個字串,是一種規則; 正則表示式的組成規則: 規則字元在java.util.regex Pattern類中 A:字元 x 字元 x。舉例:‘a’表示字元a \ 反斜線字元。 \n 新行(換行)符 (’\u

Java表示式pattern和matches

package com.lks.regex; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * * @author lks * @time 2016年6月6日下午11:02

Java表示式的語法示例

正向肯定預查,在任何匹配pattern的字串開始處匹配查詢字串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以後使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。預查不消耗字元

HBase中過濾表示式JAVA表示式不一致問題的分析和解決

HBase提供了豐富的查詢過濾功能。 比如說它提供了RegexStringComparator這樣的函式,可以實現按照正則表示式進行過濾。它可以有效地彌補向前綴查詢這樣的機制,從而可以使hbase也

JAVA中的表示式pattern/match)

正則表示式概念 所謂正則表示式就是處理字串的特殊字串 用途 字串匹配(字元匹配) 字串查詢(是建立在匹配之上的查詢) 字串替換(是建立在查詢的結果之後的替換) 例如 IP地址是否正確 從網頁中揪出Email地址 從網頁揪出連結 類 java.lang.Stri

Java表示式PatternMatcher的一般用法

一.方法說明: find()方法是部分匹配,在部分匹配時和完全匹配時返回true,匹配不上返回false。如果該匹配的串有組還可

java表示式學習筆記

本人在開發中使用正則表達的場景並不多,偶爾用一下,學習一波,時間久了就又忘記了,放到部落格中,說不定什麼時候就用到了。   一.正則表示式的語法 這個語法表來自:http://www.runoob.com/java/java-regular-expressions.html