天天看點

Java 正規表達式 正規表達式定義了字元串的模式

正規表達式可以用來搜尋、編輯或處理文本。

正規表達式并不僅限于某一種語言,但是在每種語言中有細微的差别。

正規表達式執行個體

一個字元串其實就是一個簡單的正規表達式,例如 Hello World 正規表達式比對 “Hello World” 字元串。

.(點号)也是一個正規表達式,它比對任何一個字元如:“a” 或 “1”。

下表列出了一些正規表達式的執行個體及描述:

正規表達式 描述

this is text

比對字元串 “this is text”

this\s+is\s+text

注意字元串中的 \s+。

比對單詞 “this” 後面的 \s+ 可以比對多個空格,之後比對 is 字元串,再之後 \s+ 比對多個空格然後再跟上 text 字元串。

可以比對這個執行個體:this is text

^\d+(.\d+)?

^ 定義了以什麼開始

\d+ 比對一個或多個數字

? 設定括号内的選項是可選的

. 比對 “.”

可以比對的執行個體:“5”, “1.5” 和 “2.21”。

Java 正規表達式和 Perl 的是最為相似的。

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

Pattern 類:

pattern 對象是一個正規表達式的編譯表示。Pattern 類沒有公共構造方法。要建立一個 Pattern 對象,你必須首先調用其公共靜态編譯方法,它傳回一個 Pattern 對象。該方法接受一個正規表達式作為它的第一個參數。

Matcher 類:

Matcher 對象是對輸入字元串進行解釋和比對操作的引擎。與Pattern 類一樣,Matcher 也沒有公共構造方法。你需要調用 Pattern 對象的 matcher 方法來獲得一個 Matcher 對象。

PatternSyntaxException:

PatternSyntaxException 是一個非強制異常類,它表示一個正規表達式模式中的文法錯誤。

以下執行個體中使用了正規表達式 .runoob. 用于查找字元串中是否包了 runoob 子串:

執行個體

import java.util.regex.*;

class RegexExample1{

public static void main(String args[]){

String content = "I am noob " +

“from runoob.com.”;

String pattern = ".*runoob.*";

  boolean isMatch = Pattern.matches(pattern, content);
  System.out.println("字元串中是否包含了 'runoob' 子字元串? " + isMatch);
           

}

}

執行個體輸出結果為:

字元串中是否包含了 ‘runoob’ 子字元串? true

捕獲組

捕獲組是把多個字元當一個單獨單元進行處理的方法,它通過對括号内的字元分組來建立。

例如,正規表達式 (dog) 建立了單一分組,組裡包含"d",“o”,和"g"。

捕獲組是通過從左至右計算其開括号來編号。例如,在表達式((A)(B(C))),有四個這樣的組:

((A)(B©))

(A)

(B©)

©

可以通過調用 matcher 對象的 groupCount 方法來檢視表達式有多少個分組。groupCount 方法傳回一個 int 值,表示matcher對象目前有多個捕獲組。

還有一個特殊的組(group(0)),它總是代表整個表達式。該組不包括在 groupCount 的傳回值中。

執行個體

下面的例子說明如何從一個給定的字元串中找到數字串:

RegexMatches.java 檔案代碼:

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class RegexMatches

{

public static void main( String args[] ){

// 按指定模式在字元串查找
  String line = "This order was placed for QT3000! OK?";
  String pattern = "(\\D*)(\\d+)(.*)";

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

  // 現在建立 matcher 對象
  Matcher m = r.matcher(line);
  if (m.find( )) {
     System.out.println("Found value: " + m.group(0) );
     System.out.println("Found value: " + m.group(1) );
     System.out.println("Found value: " + m.group(2) );
     System.out.println("Found value: " + m.group(3) ); 
  } else {
     System.out.println("NO MATCH");
  }
           

}

}

以上執行個體編譯運作結果如下:

Found value: This order was placed for QT3000! OK?

Found value: This order was placed for QT

Found value: 3000

Found value: ! OK?

正規表達式文法

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

在 Java 中,\ 表示:我要插入一個正規表達式的反斜線,是以其後的字元具有特殊的意義。

是以,在其他的語言中(如Perl),一個反斜杠 \ 就足以具有轉義的作用,而在 Java 中正規表達式中則需要有兩個反斜杠才能被解析為其他語言中的轉義作用。也可以簡單的了解在 Java 的正規表達式中,兩個 \ 代表其他語言中的一個 \,這也就是為什麼表示一位數字的正規表達式是 \d,而表示一個普通的反斜杠是 \\。