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

 更新時間:2020-01-15 15:59:38   作者:佚名   我要評論(0)

此篇文章是記錄我在學習Java正則表達式時候學到的和遇到的坑。
先來說說 Matcher 里面的三個方法(取的結果以group()方法為例子)

matches():整個匹配,只有整個

此篇文章是記錄我在學習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類及遇到的坑,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

您可能感興趣的文章:

  • Java NumberFormat格式化float類型的bug
  • Java NumberFormat 類的詳解及實例
  • javaweb 國際化:DateFormat,NumberFormat,MessageFormat,ResourceBundle的使用
  • java實現的日期時間轉換工具類完整示例
  • Java實現的分頁工具類與用法示例
  • java獲取包下被指定注解的類過程解析
  • Java原生服務器接收上傳文件 不使用MultipartFile類
  • Java Number類原理實例解析

相關文章

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

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

    此篇文章是記錄我在學習Java正則表達式時候學到的和遇到的坑。 先來說說 Matcher 里面的三個方法(取的結果以group()方法為例子) matches():整個匹配,只有整個
    2020-01-15
  • 前端正則表達式書寫及常用的方法

    前端正則表達式書寫及常用的方法

    正則表達式(regular expression)描述了一種字符串匹配的模式(pattern),可以用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的
    2020-01-15
  • 通過正則表達式使用ajax檢驗注冊信息功能

    通過正則表達式使用ajax檢驗注冊信息功能

    本期博客內容應該不算多,我們此次的目的是通過正則表達式并利用ajax可以實現動態交互的特點,檢驗注冊的用戶名以及密碼是否合法。 Entity層 該層主要包含一個用戶類
    2020-01-15
  • 淺談正則表達式中的分組和引用實現方法

    淺談正則表達式中的分組和引用實現方法

    問題 在外刊君讀者群中看到有人提出這樣的一個需求: 把字符串切成連續相同字符的正則怎么寫?比如abbcccdddd切成a,bb,ccc,dddd 之前我對正則表達式也是略有研究,想
    2020-01-15
  • python 正則表達式獲取字符串中所有的日期和時間

    python 正則表達式獲取字符串中所有的日期和時間

    提取日期前的處理 1.處理文本數據的日期格式統一化 text = "2015年8月31日,衢州元立金屬制品有限公司倉儲公司(以下簡稱元立倉儲公司)成品倉庫發生一起物體打擊
    2020-01-15
  • JSP+Servlet實現文件上傳到服務器功能

    JSP+Servlet實現文件上傳到服務器功能

    本文實例為大家分享了JSP+Servlet實現文件上傳到服務器功能的具體代碼,供大家參考,具體內容如下 項目目錄結構大致如下: 正如我在上圖紅線畫的三個東西:Dao、
    2020-01-15
  • 正則表達式(RegExp)判斷文本框中是否包含特殊符號

    正則表達式(RegExp)判斷文本框中是否包含特殊符號

    前言 有時,我們希望判斷文本框中用戶輸入的字符是否含有特殊符號(*/#[email protected]),就像用戶注冊時密碼框的填寫。 demo 利用 RegExp 對象,能很優雅的實現以上需求: // e
    2020-01-15
  • JSP實現分頁效果

    JSP實現分頁效果

    本文實例為大家分享了JSP實現分頁的具體代碼,供大家參考,具體內容如下 咱們在瀏覽網頁的時候,當一個頁面的數據不足以展示完全所有的內容,一般都涉及到分頁,下一
    2020-01-15
  • JS正則(RegExp)判斷文本框中是否包含特殊符號

    JS正則(RegExp)判斷文本框中是否包含特殊符號

    前言 有時,我們希望判斷文本框中用戶輸入的字符是否含有特殊符號(*/#[email protected]),就像用戶注冊時密碼框的填寫。 demo 利用 RegExp 對象,能很優雅的實現以上需求: // e
    2020-01-15
  • UNIX/LINUX SHELL 正則表達式語法詳解附使用方法

    UNIX/LINUX SHELL 正則表達式語法詳解附使用方法

    幾乎所有重要問題都需要從無用數據中過濾出有用數據。了解大量的 UNIX? 命令行實用工具如何使用正則表達式 來去蕪取精。 非常奇怪,直到今天我仍然能重復周六
    2020-01-15

最新評論

老快3投注技巧 投资理财平台网 上海时时乐号码走势图 甘肃十一选五今天推荐 福建快三专家推荐号 河北快3app官方下载 娱乐电玩城游戏 爱配资网址导航 pk10免费计划网站 内蒙古快三开奖结果查 股票开盘收盘时间 下载贵州快3 股票配资平台正规 黑龙江6 1体彩开奖结果查询 秒速赛车彩票技巧 上证指数000783 燕赵风采排列7开奖结果