程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 詳解Java正則表達式中Pattern類和Matcher類

詳解Java正則表達式中Pattern類和Matcher類

編輯:關於JAVA

詳解Java正則表達式中Pattern類和Matcher類。本站提示廣大學習愛好者:(詳解Java正則表達式中Pattern類和Matcher類)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解Java正則表達式中Pattern類和Matcher類正文


前言

本文將引見Java正則表達式中的Pattern類與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時,才可以運用.

總結

以上就這篇文章的全部內容了,希望本文的內容對大家的學習或許任務能帶來一定的協助,假如有疑問大家可以留言交流,謝謝大家對的支持。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved