Java 正則表達式

概念

正則表達式,又稱正規表示式、正規表示法、正規表達式、規則表達式、常規表示法(英語:Regular Expression,在代碼中常簡寫爲regex、regexp或RE),是計算機科學的一個概念。正則表達式使用單個字符串來描述、匹配一系列匹配某個句法規則的字符串。在不少文本編輯器裏,正則表達式一般被用來檢索、替換那些匹配某個模式的文本。html

相關類

java.util.regex 包主要包括如下三個類:java

  • Pattern 類: pattern 對象是一個正則表達式的編譯表示。Pattern 類沒有公共構造方法。要建立一個 Pattern 對象,你必須首先調用其公共靜態編譯方法,它返回一個 Pattern 對象。該方法接受一個正則表達式做爲它的第一個參數。正則表達式

  • Matcher 類: Matcher 對象是對輸入字符串進行解釋和匹配操做的引擎。與Pattern 類同樣,Matcher 也沒有公共構造方法。你須要調用 Pattern 對象的 matcher 方法來得到一個 Matcher 對象。express

  • PatternSyntaxException: PatternSyntaxException 是一個非強制異常類,它表示一個正則表達式模式中的語法錯誤。編輯器

案例解析

HelloWorld

String expression = "HelloWorld";

// 建立 Pattern 對象
Pattern pattern = Pattern.compile(expression);

// 如今建立 Matcher 對象
Matcher matcher = pattern.matcher("HelloWorld");

if (matcher.matches()) {
    System.out.println("匹配");
} else {
    System.out.println("不匹配");
}

咱們以 HelloWorld 字符串做爲正則表達式參數建立了一個 Pattern 對象,接着傳入一個須要匹配的字符串(這裏爲 HelloWorld ),建立了 Matcher 對象,程序的最後打印結果爲:url

成功

表明正則匹配成功。code

匹配 url

好比有url以下regexp

http://www.abc.com/1.html
http://www.abc.com/2.html

若是使用以下正則表達式:htm

String expression = "http://www.abc.com/1.html";

就只能匹配 http://www.abc.com/1.htmlhttp://www.abc.com/2.html 匹配不了。對象

修改成以下:

String expression = "http://www.abc.com/\\d+\\.html"

兩個都能匹配了。

String expression = "http://www.abc.com/\\d+\\.html"

// 建立 Pattern 對象
Pattern pattern = Pattern.compile(expression);

// 如今建立 Matcher 對象
Matcher matcher = pattern.matcher("http://www.abc.com/1.html");

if (matcher.matches()) {
    System.out.println("匹配");
} else {
    System.out.println("不匹配");
}

注意上面 expression 中的 \\d+,這個表明正則表達式模式語法。這也是不少人以爲正則表達式是噩夢的緣由,可能以爲該模式語法很奇怪。

好比 \\d+ 是由兩個語法組成的:

  • \d:數字字符匹配。等效於 [0-9]。
  • +:一次或屢次匹配前面的字符或子表達式。例如,"zo+"與"zo"和"zoo"匹配,但與"z"不匹配。+ 等效於 {1,}。

組合起來能夠解釋爲,匹配一個或者多個數字,好比:1,2,222,4344,都能匹配成功。

因此使用 String expression = "http://www.abc.com/\\d+\\.html" 來匹配 http://www.abc.com/1.html 是能夠成功的。

還有一個 \\. 也須要解釋一下,由於點號 . 在正則表達式語法裏面有特殊意義,須要轉義一下,因此 \\. 表明匹配點號 .

String expression = "." 能夠匹配除"\r\n"以外的任何單個字符,好比:abc。若是想匹配點號 .,能夠寫 String expression = "\\.",這樣就只能匹配單個點號 . 了。

兩個斜線的問題

在其餘語言中,\\ 表示:我想要在正則表達式中插入一個普通的(字面上的)反斜槓,請不要給它任何特殊的意義。

在 Java 中,\\ 表示:我要插入一個正則表達式的反斜線,因此其後的字符具備特殊的意義。

因此,在其餘的語言中,一個反斜槓 \ 就足以具備轉義的做用,而在正則表達式中則須要有兩個反斜槓才能被解析爲其餘語言中的轉義做用。也能夠簡單的理解在正則表達式中,兩個 \ 表明其餘語言中的一個 \,這也就是爲何表示一位數字的正則表達式是 \\d,而表示一個普通的反斜槓是 \\\\

正則表達式語法

參考這裏

匹配和操做分組

在每種模式中,經過將模式的各部分放在圓括號中來建立分組。分組從左向右編號,從 1 開始編號(分組 0 表示完整的匹配結果,表明整個表達式)。

好比上面匹配 url 的正則表達式,String expression = "http://www.abc.com/\\d+\\.html" 來匹配 http://www.abc.com/1.htmlhttp://www.abc.com/2.html,想要得到那個匹配的數字 1 和 2,能夠修改以下:

String expression = "http://www.abc.com/(\\d+)\\.html";

// 建立 Pattern 對象
Pattern pattern = Pattern.compile(expression);

// 如今建立 Matcher 對象
Matcher matcher = pattern.matcher("http://www.abc.com/1.html");

if (matcher.matches()) {
    System.out.println("匹配");
    System.out.println("group0:" + matcher.group());
    System.out.println("group1:" + matcher.group(1));
} else {
    System.out.println("不匹配");
}

結果以下:

匹配
group0:http://www.abc.com/1.html
group1:1

能夠看到,咱們獲取到了那個匹配的數字。

咱們在原來 \\d+ 的基礎上,加了一對括號 (\\d+),由於 String expression = "http://www.abc.com/(\\d+)\\.html" 裏面只有一對括號,因此 (\\d+) 這部分表明第一組。

再來一個稍微複雜點兒的,好比想得到 3室1廳2衛 中的 3,1,2,能夠以下作

String expression = "(\\d)\\D(\\d)\\D(\\d)\\D";

// 建立 Pattern 對象
Pattern pattern = Pattern.compile(expression);

// 如今建立 Matcher 對象
Matcher matcher = pattern.matcher("3室1廳2衛");

if (matcher.matches()) {
    System.out.println("匹配");
    System.out.println("group0:" + matcher.group());
    System.out.println("group1:" + matcher.group(1));
    System.out.println("group2:" + matcher.group(2));
    System.out.println("group3:" + matcher.group(3));
} else {
    System.out.println("不匹配");
}

結果以下:

匹配
group0:3室1廳2衛
group1:3
group2:1
group3:2

String expression = "(\\d)\\D(\\d)\\D(\\d)\\D" 解釋以下,從左往右讀:

  • 第1個字符匹配一個數字,並且爲第1組
  • 第2個字符匹配一個非數字
  • 第3個字符匹配一個數字,並且爲第2組
  • 第4個字符匹配一個非數字
  • 第5個字符匹配一個數字,並且爲第3組
  • 第6個字符匹配一個非數字

參考資料

相關文章
相關標籤/搜索