在Java中如何使用正則表達式



title: 在Java中如何使用正則表達式
date: 2020-01-09 21:52:41
tags: JavaSE
categories: JavaSE


前言

  最近放寒假了,時間比較多,終於有時間繼續研究Java的基礎知識。這幾天在看《Java編程思想》這本書,剛好看完了正則表達式這一張章節,寫一遍博客記錄以下,防止忘記(雖然還是會忘記)


介紹

什么是正則表達式?

  正則表達式(Regular Expression)是一種文本模式,包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱為"元字符")。正則表達式使用單個字符串描述、匹配一系列符合某個句法規則的字符串(CV大法)。

  說白了,正則表達式就是定義字符串的規則。我們使用正則表達式,為字符串定義一個規則,比如我們定義一個正則表達式,表示一個只由數字組成,長度任意的字符串,然后,我們就可以用這個正則表達式去匹配任意字符串,看這個字符串是否匹配這個規則。


在Java中如何使用正則表達式?

  正則表達式的語法我這里就不提了,太多太雜,不會的可以去菜鳥教程看看,我這里主要就是寫寫在Java中如何使用正則表達式。

  在Java中使用正則表達式,首先得知道兩個類,一個叫做Pattern,一個叫做Matcher,這兩個類都是java.util.regex包下的,這個包下也就這兩個類。

Pattern類

  Pattern類是用來干嘛的呢,其實我們可以把他簡單理解為就是一個正則表達式(就像File類一樣,我們可以簡單理解為它就是一個文件)。Pattern類沒有公共的構造方法,這意味着我們不能直接new一個Pattern類的對象。在這個類中,提供了一個方法,名字叫compile,我們將正則表達式作為參數,傳入這個方法中,就可以得到一個Pattern對象,我們可以將這個對象理解為就是傳入的正則表達式。

  Pattern類有一個實例方法,叫做matcher,這個方法接收一個參數,就是需要匹配的字符串,方法的返回值就是一個Mather對象。

Matcher類

  Matcher類又是用來干嘛的呢?Matcher這個單詞翻譯過來就是匹配器的意思,一個Matcher對象就是一個匹配器,我們通過這個匹配器,就可以操作正則表達式與字符串的匹配過程。操作的是哪個正則表達式和字符串呢?就是我們調用Pettern類的compile方法生成的Pettern對象,以及調用Pettern對象的matcher方法傳入的要匹配的字符串。通過這個匹配器對象,我們可以控制字符串的匹配,查看匹配結果,甚至可以替換等便利的操作。


代碼

正則表達式小demo

  下面我們看一個簡單的小demo:使用正則表達式,匹配字符串中所有數字部分,輸出匹配的部分,以及匹配的部分在原字符串中的位置

public static void main(String[] args) throws FileNotFoundException {
		
    // 使用Pattern類的compile方法,傳入一個正則表達式,得到一個Pattern對象
    Pattern pattern = Pattern.compile("[0-9]+");
    // 調用pattern對象的matcher方法,傳入需要匹配的字符串, 得到一個匹配器對象
    Matcher matcher = pattern.matcher("abcd123acca123a1a2");

    // 從字符串開頭,逐一向后匹配,直到無法再匹配為止
    while(matcher.find()) {
        // 輸出上一次匹配的內容
        System.out.print(matcher.group() + ":  ");
        // 輸出上一次匹配的首尾索引
        System.out.println(matcher.start() + "->" + (matcher.end()-1) );
    }
}

  上面的代碼首先使用Pattern類的compile方法,傳入一個正則表達式,得到一個Pattern對象,[0-9]+這個表達式的意思就是任意長度,且僅由0-9組成的字符串。得到Pattern對象后,調用它的matcher方法,傳入需要匹配的字符串,即可得到一個匹配器,也就是Matcher對象。

  得到這個Matcher對象后,就可以進行匹配操作了。在上面的代碼中,調用了find方法進行匹配。find方法的作用就是嘗試從字符串中找到下一個匹配正則表達式的部分,若匹配成功,就返回true,否則返回false,而已經匹配的部分會被跳過。Matcher對象的group()方法返回上一次匹配的部分,而start()方法返回上一次匹配部分的開始索引,end()方法返回上一次匹配部分的結束索引+1的值。我們在while循環的條件中調用find方法進行匹配,若匹配成功,則輸出上次匹配的部分,以及匹配部分在原字符串中的位置。例如上面的代碼,輸出結果如下:

123:  4->6
123:  11->13
1:  15->15
2:  17->17

總結

  上面描述了PatternMatcher類最基本的操作,但是這兩個類的作用遠不止如此,它們還可以進行很多方便的操作,比如替換操作等,但是這里就不一一描述了,有時間再慢慢補充。


參考

《Java編程思想》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM