Java正則相關的Pattern和Matcher類及遇到的坑

 更新時間:2019年09月09日 10:58:39   作者:jejaywong   我要評論
這篇文章主要介紹了Java正則相關的Pattern和Matcher類及遇到的坑,本文給大家提到了Matcher 里面的三個方法,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下

此篇文章是記錄我在學習Java正則表達式時候學到的和遇到的坑。

先來說說 Matcher 里面的三個方法(取的結果以group()方法為例子)

  • matches():整個匹配,只有整個字符序列完全匹配成功,才返回True,否則返回False。但如果前部分匹配成功,將移動下次匹配的位置。舉個例子如果字符串為"a123",正則表達式為"\w\d\d\d",則matches()方法才返回true,換言之,就是要匹配的字符串需要跟正則表達式一一對應,字母對應字母,數字對應數字,所以稱之為完全匹配,錯一位都不行。(這里的理解花了我好長時間,網上搜到的都沒有提及,也許是我理解能力不夠)
  • find():部分匹配,從當前位置開始匹配,找到一個匹配的子串,將移動下次匹配的位置。“find()像迭代器那樣向前遍歷輸入字符串。” --摘自《Java編程思想。看下面的例子中的find()方法,要匹配的字符串為"a123b",正則表達式為"\d\d\d",而最后輸出結果為:123,所以稱之為部分匹配,只要有,就返回true。
  • lookingAt():部分匹配,總是從第一個字符進行匹配,匹配成功了不再繼續匹配,匹配失敗了,也不繼續匹配。lookingAt()方法介于matches()和find()方法之間。lookingAt()方法的部分匹配指從第一位開始匹配如果第一位沒有匹配到,就不再匹配,直接返回false,如果第一位匹配到了,則匹配第二位,以此類推。例子:要匹配的字符串為"a123b",正則表達式為"\w\d\d",輸出結果為"a12",很好理解,就是一位一位地匹配,匹配到了就匹配下一位。"\w\d\d"這個正則正好代表"字母數字數字",所以正好輸出結果為a12。

好了上測試代碼:

package com.wjj.utils;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author 作者 : 榨菜哥
* @version 創建時間:2016年8月18日 上午8:47:58
* 類說明:正則表達式的練習
*/
public class Regex {
  //find方法測試
  public static void find(String html) {
    String regex = "\\d\\d\\d";
    Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
    Matcher matcher = pattern.matcher(html);
    System.out.print("find():");
    if (matcher.find()) {
      System.out.println(matcher.group());
    }
  }
  //matches方法測試
  public static void matches(String html) {
    String regex = "^\\w\\d\\d\\d";
    Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
    Matcher matcher = pattern.matcher(html);
    System.out.print("matches():");
    if (matcher.matches()) {
      System.out.println(matcher.group());
    }
  }
  //lookingAt方法測試
  public static void lookingAt(String html) {
    String regex = "\\w\\d\\d";
    Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
    Matcher matcher = pattern.matcher(html);
    System.out.print("lookingAt():");
    if (matcher.lookingAt()) {
      System.out.println(matcher.group());
    }
  }
  public static void main(String[] args) {
    //find方法測試
    find("a123b");
    //matches方法測試
    matches("a123");
    //lookingAt方法測試
    lookingAt("a123b");
  }
}

輸出結果:

    find():123
    matches():a123
    lookingAt():a12

小結:正則表達式本身并不難,平常使用的時候只要按照規則來寫就好了。在學習中理解matches、find、和lookingAt三個方法花了我比較長的時間,一直不能理解完全匹配和部分匹配是什么意思,最后還是在stackoverflow上找到了想要的答案。

以上是個人學習的理解,有不對之處,希望給予指點。

(補充:正則表達式Pattern如果調用多次容易出問題,比如內存溢出,因為Pattern每執行一次就編譯一次正則表達式,因此建議將需要的正則表達式進行預編譯。)

正則表達式學習教程: http://deerchao.net/tutorials/regex/regex.htm ,文中作者寫得挺詳細的,并且通俗易懂。

總結

以上所述是小編給大家介紹的Java正則相關的Pattern和Matcher類及遇到的坑,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

相關文章

  • php下常用表單驗證的正則表達式

    php下常用表單驗證的正則表達式

    php下經常用到的驗證表單是不是email,是不是數字等的正則表達式,直接可以用
    2008-06-06
  • 正則表達式簡介及在C++11中的簡單使用教程

    正則表達式簡介及在C++11中的簡單使用教程

    正則表達式(regular expression)是計算機科學中的一個概念,又稱規則表達式,通常簡寫為regex、regexp、RE、regexps、regexes、regexen。接下來通過本文給大家介紹正則表達式簡介及在C++11中的簡單使用教程,一起通過本文學習吧
    2017-02-02
  • javascript常用正則表達式合集

    javascript常用正則表達式合集

    常用的正則驗證代碼,非常的全面,但因為是針對以前的版本,例如手機等,學習正則與使用正則驗證表單的朋友絕對值得參考。
    2010-08-08
  • jQuery驗證手機號郵箱身份證的正則表達式(含港澳臺)

    jQuery驗證手機號郵箱身份證的正則表達式(含港澳臺)

    本文通過一個demo實例給大家介紹了jquery驗證手機號郵箱身份證的正則表達式含有港澳臺的手機號,非常不錯,具有參考借鑒價值,感興趣的朋友一起看看吧
    2016-10-10
  • 瀏覽器中的正則表達式陷阱說明

    瀏覽器中的正則表達式陷阱說明

    js 內置對象 RegExp 我們用的很習慣 也很舒服 但是里面卻有 嚴重的隱患 或者陷阱...原因在于 有些瀏覽器 對正則表達式直接量的優化.
    2010-05-05
  • asp match正則函數使用Matchs實例

    asp match正則函數使用Matchs實例

    asp matchs函數提供了對正則表達式匹配的只讀屬性的訪問。一直都用這個函數,沒想到本站竟然沒有這類文章,汗一個,最近我會多加一些這樣的文章
    2008-08-08
  • 淺析正則表達式-替換原則(.NET) 圖文

    淺析正則表達式-替換原則(.NET) 圖文

    最近經常用到替換的東西所以就出來整理下,這里要分享的是正則表達式里面的替換原則,首先要聲明的是這里提及到的替換原則是.NET里面的正則表達式的替換原則
    2016-05-05
  • Java正則表達式入門基礎篇(新手必看)

    Java正則表達式入門基礎篇(新手必看)

    這篇文章給大家介紹java正則表達式入門基礎篇, 由于正則表達式是一個很龐雜的體系,所以我僅例舉些入門的概念,更多的請參閱相關書籍及自行摸索。感興趣的朋友一起跟著小編來看看吧
    2015-10-10
  • 精確查找PHP WEBSHELL木馬 修正版

    精確查找PHP WEBSHELL木馬 修正版

    上篇提到了關于網上流傳查找PHP webshell的python腳本中,不嚴謹的代碼,并且給出了一個python的檢測代碼,同時,下文里也提到不能檢測到反引號的命令執行的地方。今天,我想了下,現在把思路發出來。
    2011-04-04
  • 最新手機號碼、電話號碼正則表達式

    最新手機號碼、電話號碼正則表達式

    相信大家對正則表達式一定都有所了解和研究,這篇文章主要為大家分享了最新驗證手機號碼和電話號碼的正則表達式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11

最新評論

福建体育彩票时时彩11