Java正規表示式簡單介紹

vipshop_fin_dev發表於2018-08-18

正規表示式是電腦科學的一個概念,通常用於檢索。替換符合某個規則的文字。使用正規表示式,我們能夠以程式設計的方式,構造複雜的文字模式,並對輸入的字串進行搜尋。一旦找到了匹配這些模式的部分,就能對其進行進一步的處理。

簡單示例

public class Main {
    public static void main(String[] args) {
        //匹配帶正號的數值
        System.out.println("+123".matches("\\+\\d+"));
        String str = "12321asdf1231dsfe532";
        //按英文字元分割
        for (String tmp : str.split("[a-zA-Z]+")) {
            System.out.println(tmp);
        }
    }
}

輸出

true
12321
1231
532

基礎

正規表示式其實就是以某種方式來描述字串。與其他的語言有所不同,“\”在其他語言的正規表示式中通常表示一個普通的反斜槓,而在Java中,其表示一個正規表示式的反斜槓,其後的字元就有特殊意義。舉例來說,“\\”表示一個普通的反斜槓,“\d”表示一位數字。其中換行和製表符之類的是特例,直接使用“\n\r”即可。

建立正規表示式

列舉部分常用的構造集。

字元

正規表示式 含義
B 表示字元B
\xhh 十六進位制值為oxhh的字元
\uhhhh 十六進位制表示為oxhhhh的Unicode字元
\t 製表符
\n 換行符
\r 回車

字元類

正規表示式 含義
[abc] abc任意字元
[^abc] abc之外的任意字元
[a-zA-Z] a到z或A到Z範圍內的字元
[abc[hij]] abchij任意字元
[a-z&&[hij]] hij任意字元(交集)
\s 空白符(空格、tab、換行、換頁和回車)
\S 非空白符,同[^\s]
\d 任意數字,同[0-9]
\D 非數字,同[^0-9]
\w 詞字元[a-zA-Z0-9]
\W 非詞詞彙,同[^\w]

邏輯操作符

正規表示式 含義
XY Y跟在X後面
X|Y X或Y
(X) 捕獲組。可以在表示式中用\i引用第i個捕獲組

邊界匹配符

正規表示式 含義
^ 一行的起始
$ 一行的結束
\b 詞的邊界
\B 非詞的邊界
\G 前一個匹配的結束

限定詞

正規表示式 含義
X? 一個或零個X
X* 零個或多個X
X+ 一個或多個X
X{n} 恰好n次X
X{n,} 至少n次X
X{n,m} X至少n次,且不超過m次

表示式X通常應該用圓括號括起來,以便它能夠按照預期的效果執行。

Pattern和Matcher

Java中除了使用String類來使用正規表示式,還提供了功能更為強大的Pattern和Matcher類。一般的使用方法為:
1. 使用Pattern.compile()方法,根據提供的String型別的正規表示式生成Pattern物件。
2. 將需要檢索的字串傳入Pattern物件的matcher()方法,生成Matcher物件。
3. 使用Matcher物件進行操作。

簡單示例

public class Main {
    public static void main(String[] args) {
        //獲取英文單詞
        String str = "apple banana orange";
        Pattern pattern = Pattern.compile("[a-zA-Z]+");
        Matcher matcher = pattern.matcher(str);
        while (matcher.find()) {
            System.out.println(matcher.group() + " start:"
                    + matcher.start() + " end:" + matcher.end());
        }
    }
}

輸出

apple start:0 end:5
banana start:6 end:12
orange start:13 end:19

Matcher

start()、end()

在匹配成功後,start()返回先前匹配的起始位置的索引,而end()返回所匹配的最後字元的索引位置加一的值。

matchers()

matchers()方法用於判斷整個輸入字串是否匹配正規表示式。上述例子中執行System.out.println(matcher.matches());,將輸出false

lookingAt()

lookingAt()方法用於判斷該字串的起始部分是否匹配模式。上述例子中執行System.out.println(matcher.lookingAt());,將輸出true

find()

find()方法類似迭代器中的next(),向前遍歷輸入字串。

find(int start)

find(int start)能夠接受一個整數引數,該整數表示字串中字元的位置,並以其作為搜尋起點。將上述例子修改:

public class Main {
    public static void main(String[] args) {
        //獲取英文單詞
        String str = "apple banana orange";
        Pattern pattern = Pattern.compile("[a-zA-Z]+");
        Matcher matcher = pattern.matcher(str);
        if (matcher.find(2)) {
            System.out.println(matcher.group());
        }
    }
}

輸出

ple
組(group)

組是用括號劃分的正規表示式,可以根據組的編號來引用某個組。組號為0表示整個正規表示式,組號為1表示被第一對括號括起的組,以此類推。以A(B(C))D為例,共三個組,組0為ABCD,組1為BC,組2為C。

groupCount()

groupCount()返回該匹配器的模式中的分組數目,第0組不包括在內。

group()

group()返回前一次匹配操作的第0組。

group(int i)

group(int i)返回在前一次匹配操作期間指定的組。下面是簡單的示例,第1組為\\d+

public class Main {
    public static void main(String[] args) {
        String str = "apple123banana";
        Pattern pattern = Pattern.compile("[a-zA-Z]+(\\d+)[a-zA-Z]+");
        Matcher matcher = pattern.matcher(str);
        System.out.println(matcher.groupCount());
        if (matcher.find()) {
            System.out.println(matcher.group(1));
        }
    }
}

輸出

1
123

相關文章