關於java中Pattern和Matcher區別於聯繫

来源:http://www.cnblogs.com/applerosa/archive/2017/04/07/6677862.html
-Advertisement-
Play Games

本文章轉自: http://blog.csdn.net/cclovett/article/details/12448843 結論:Pattern與Matcher一起合作.Matcher類提供了對正則表達式的分組支持,以及對正則表達式的多次匹配支持. 單獨用Pattern只能使用Pattern.mat ...


本文章轉自: http://blog.csdn.net/cclovett/article/details/12448843

 

結論:Pattern與Matcher一起合作.Matcher類提供了對正則表達式的分組支持,以及對正則表達式的多次匹配支持. 單獨用Pattern只能使用Pattern.matcher(String regex,CharSequence input)一種最基礎最簡單的匹配。


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

1 Pattern p=Pattern.compile("\\d+");
2 Matcher m=p.matcher("22bb23");
3 m.matches();//返回false,因為bb不能被\d+匹配,導致整個字元串匹配未成功.
4 Matcher m2=p.matcher("2223");
5 m2.matches();//返回true,因為\d+匹配到了整個字元串 


  我們現在回頭看一下 Pattern.matcher(String regex,CharSequence input) ,它與下麵這段代碼等價
   Pattern.compile(regex).matcher(input).matches()  

  lookingAt()對前面的字元串進行匹配,只有匹配到的字元串在最前面才返回true

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()對字元串進行匹配,匹配到的字元串可以在任何位置.
  

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()返回匹配到的子字元串

 1 Pattern p=Pattern.compile("\\d+");
 2 Matcher m=p.matcher("aaa2223bb");
 3 m.find();//匹配2223
 4 m.start();//返回3
 5 m.end();//返回7,返回的是2223後的索引號
 6 m.group();//返回2223
 7 
 8 Mathcer m2=p.matcher("2223bb");
 9 m2.lookingAt();   //匹配2223
10 m2.start();   //返回0,由於lookingAt()只能匹配前面的字元串,所以當使用lookingAt()匹配時,start()方法總是返回0
11 m2.end();   //返回4
12 m2.group();   //返回2223
13 
14 Matcher m3=p.matcher("2223"); //如果Matcher m3=p.matcher("2223bb"); 那麼下麵的方法出錯,因為不匹配返回false
15 m3.matches();   //匹配整個字元串
16 m3.start();   //返回0
17 m3.end();   //返回3,原因相信大家也清楚了,因為matches()需要匹配所有字元串
18 m3.group();   //返回2223


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

 1 Pattern p=Pattern.compile("([a-z]+)(\\d+)");
 2 Matcher m=p.matcher("aaa2223bb");
 3 m.find();   //匹配aaa2223
 4 m.groupCount();   //返回2,因為有2組
 5 m.start(1);   //返回0 返回第一組匹配到的子字元串在字元串中的索引號
 6 m.start(2);   //返回3
 7 m.end(1);   //返回3 返回第一組匹配到的子字元串的最後一個字元在字元串中的索引位置.
 8 m.end(2);   //返回7
 9 m.group(1);   //返回aaa,返回第一組匹配到的子字元串
10 m.group(2);   //返回2223,返回第二組匹配到的子字元串 


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

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

  輸出:
    456456
    0532214
    123

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

1 while(m.find()) {
2      System.out.println(m.group());
3      System.out.print("start:"+m.start());
4      System.out.println(" end:"+m.end());
5 } 

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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 首先,先簡單介紹一下MD5 MD5的全稱是message-digest algorithm 5(信息-摘要演算法,在90年代初由mit laboratory for computer science和rsa data security inc的ronald l. rivest開發出來, 經md2、md ...
  • NET Core 第二部分: centos7 helloworld 站點 在開發機器上(我是在台式機),用Visual Studio 2017 發佈NET Core mvc ,上傳到Centos伺服器,客戶端開發機器可以訪問Helloworl站點 開發環境:windows7+Visual Studi ...
  • MyBatis是一個“半自動化”的ORM框架,ORM即Object/Relation Mapping,對象關係映射,是面向對象編程語言跟關係型資料庫的橋梁,將編程語言對Java實體類的操作映射到資料庫中。 下麵以向資料庫中添加一條圖書信息為例,說明MyBatis的入門操作 MyEclipse中新建個 ...
  • 圖中的綠色的虛線代表實現,綠色實線代表介面之間的繼承,藍色實線代表類之間的繼承。 1)AbstractCollection:提供了大量的Collectin實現 兩個抽象方法: public abstract Iterator<E> iterator(); public abstract int si ...
  • MyBatis攔截器原理探究 http://www.cnblogs.com/fangjian0423/p/mybatis-interceptor.html 【myBatis】Mybatis中的攔截器 http://blog.csdn.net/moshenglv/article/details/526 ...
  • 數組:鍵值對組成的語言結構, 根據維數可分為:一維數組、多維數組 根據Key可分為:索引數組、關聯數組 PHP數組 創立數組的方式: $ar_1 = array();//空數組 $ar_2 = array(0,1,2)//初始化數組,有3個值 $ar_3[0] = 1; $ar_3['name'] ...
  • 題目:將一個正整數分解質因數。例如:輸入90,列印輸出90=2*3*3*5。 ...
  • 設計思想: 1.使用正則表達式判斷版本號格式是否正確 2.將字元串用”.”分隔成數組 3.比較數組長度,將長度短的數組用“0”補齊成相等長度數組 4.逐個遍曆數組元素,比較大小 測試用例: 1.版本號為空 2.版本號含非數字 3.版本號長度不一致 4.版本號以點為分隔,逐位比較 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...