Java 正則表示式 - 快速指南



Java 正則表示式 - 概述

Java 提供 `java.util.regex` 包用於使用正則表示式進行模式匹配。Java 正則表示式與 Perl 程式語言非常相似,非常容易學習。

正則表示式是一系列特殊的字元序列,它幫助你使用模式中包含的特殊語法來匹配或查詢其他字串或字串集。它們可以用於搜尋、編輯或操作文字和資料。

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

  • Pattern 類 - Pattern 物件是正則表示式的編譯表示。Pattern 類沒有提供公共建構函式。要建立模式,必須首先呼叫其公共靜態 `compile()` 方法之一,然後它將返回一個 Pattern 物件。這些方法接受正則表示式作為第一個引數。

  • Matcher 類 - Matcher 物件是解釋模式並對輸入字串執行匹配操作的引擎。與 Pattern 類一樣,Matcher 也沒有定義公共建構函式。可以透過在 Pattern 物件上呼叫 `matcher()` 方法來獲得 Matcher 物件。

  • PatternSyntaxException - PatternSyntaxException 物件是一個未經檢查的異常,它指示正則表示式模式中的語法錯誤。

Java 正則表示式 - 捕獲組

捕獲組是一種將多個字元視為單個單元的方法。它們是透過將要分組的字元放在一組括號內建立的。例如,正則表示式 `(dog)` 建立一個包含字母“d”、“o”和“g”的單個組。

捕獲組按從左到右的開括號順序編號。例如,在表示式 `((A)(B(C)))` 中,有四個這樣的組:

  • ((A)(B(C)))
  • (A)
  • (B(C))
  • (C)

要找出表示式中存在多少個組,請在匹配器物件上呼叫 `groupCount` 方法。`groupCount` 方法返回一個 `int` 值,表示匹配器模式中存在的捕獲組數。

還有一個特殊的組,組 0,它始終表示整個表示式。此組不包含在 `groupCount` 報告的總數中。

示例

以下示例說明如何從給定的字母數字字串中查詢數字字串:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches {
   public static void main( String args[] ) {
      // String to be scanned to find the pattern.
      String line = "This order was placed for QT3000! OK?";
      String pattern = "(.*)(\\d+)(.*)";

      // Create a Pattern object
      Pattern r = Pattern.compile(pattern);

      // Now create matcher object.
      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) );
      } else {
         System.out.println("NO MATCH");
      }
   }
}

這將產生以下結果:

輸出

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

Java 正則表示式 - MatchResult 介面

介紹

`java.util.regex.MatchResult` 介面表示匹配操作的結果。此介面包含用於確定與正則表示式匹配的結果的查詢方法。可以透過 MatchResult 檢視匹配邊界、組和組邊界,但不能修改它們。

介面宣告

以下是 `java.util.regex.MatchResult` 介面的宣告:

public interface MatchResult

介面方法

序號 方法和描述
1 int end()

返回匹配的最後一個字元之後的偏移量。

2 int end(int group)

返回在此匹配期間由給定組捕獲的子序列的最後一個字元之後的偏移量。

3 String group()

返回上次匹配匹配的輸入子序列。

4 String group(int group)

返回上次匹配操作期間由給定組捕獲的輸入子序列。

5 int groupCount()

返回此匹配結果的模式中的捕獲組數。

6 int start()

返回匹配的起始索引。

7 int start(int group)

返回在此匹配期間由給定組捕獲的子序列的起始索引。

Java 正則表示式 - Pattern 類

介紹

`java.util.regex.Pattern` 類表示正則表示式的已編譯表示。

類宣告

以下是 `java.util.regex.Pattern` 類的宣告:

public final class Pattern
   extends Object
      implements Serializable

欄位

以下是 `java.util.regex.Duration` 類的欄位:

  • static int CANON_EQ - 啟用規範等價。

  • static int CASE_INSENSITIVE - 啟用不區分大小寫的匹配。

  • static int COMMENTS - 允許模式中的空格和註釋。

  • static int DOTALL - 啟用 dotall 模式。

  • static int LITERAL - 啟用模式的逐字解析。

  • static int MULTILINE - 啟用多行模式。

  • static int UNICODE_CASE - 啟用 Unicode 感知的案例摺疊。

  • static int UNICODE_CHARACTER_CLASS - 啟用預定義字元類和 POSIX 字元類的 Unicode 版本。

  • static int UNIX_LINES - 啟用 Unix 行模式。

類方法

序號 方法和描述
1 static Pattern compile(String regex)

將給定的正則表示式編譯成模式。

2 static Pattern compile(String regex, int flags)

使用給定的標誌將給定的正則表示式編譯成模式。

3 int flags()

返回此模式的匹配標誌。

4 Matcher matcher(CharSequence input)

建立一個匹配器,它將使用此模式匹配給定的輸入。

5 static boolean matches(String regex, CharSequence input)

編譯給定的正則表示式並嘗試使用它匹配給定的輸入。

6 String pattern()

返回從此模式編譯的正則表示式。

7 static String quote(String s)

為指定的字串返回一個文字模式字串。

8 String[] split(CharSequence input)

根據此模式的匹配項拆分給定的輸入序列。

9 String[] split(CharSequence input, int limit)

根據此模式的匹配項拆分給定的輸入序列。

10 String toString()

返回此模式的字串表示形式。

繼承的方法

此類繼承自以下類的方法:

  • java.lang.Object

Java 正則表示式 - Matcher 類

介紹

`java.util.regex.Matcher` 類充當引擎,透過解釋 Pattern 對字元序列執行匹配操作。

類宣告

以下是 `java.util.regex.Matcher` 類的宣告:

public final class Matcher
   extends Object
      implements MatchResult

類方法

序號 方法和描述
1 Matcher appendReplacement(StringBuffer sb, String replacement)

實現非終端追加和替換步驟。

2 StringBuffer appendTail(StringBuffer sb)

實現終端追加和替換步驟。

3 int end()

返回匹配的最後一個字元之後的偏移量。

4 int end(int group)

返回上次匹配操作期間由給定組捕獲的子序列的最後一個字元之後的偏移量。

5 boolean find()

嘗試查詢輸入序列中與模式匹配的下一個子序列。

6 boolean find(int start)

重置此匹配器,然後嘗試查詢輸入序列中與模式匹配的下一個子序列,從指定的索引開始。

7 String group()

返回上次匹配操作期間由給定組捕獲的輸入子序列。

8 String group(String name)

返回上次匹配操作期間由給定的命名捕獲組捕獲的輸入子序列。

9 int groupCount()

返回此匹配器的模式中的捕獲組數。

10 boolean hasAnchoringBounds()

查詢此匹配器的區域邊界的錨定。

11 boolean hasTransparentBounds()

查詢此匹配器的區域邊界的透明性。

12 boolean hitEnd()

如果上次此匹配器執行的匹配操作中搜索引擎命中輸入的結尾,則返回 true。

13 boolean lookingAt()

嘗試從區域的開頭開始將輸入序列與模式匹配。

14 boolean matches()

嘗試將整個區域與模式匹配。

15 Pattern pattern()

返回此匹配器解釋的模式。

16 static String quoteReplacement(String s)

為指定的字串返回一個文字替換字串。

17 Matcher region(int start, int end)

設定此匹配器的區域限制。

18 int regionEnd()

報告此匹配器的區域的結束索引(獨佔)。

19 int regionStart()

報告此匹配器的區域的起始索引。

20 String replaceAll(String replacement)

將輸入序列中與模式匹配的每個子序列替換為給定的替換字串。

21 String replaceFirst(String replacement)

將輸入序列中與模式匹配的第一個子序列替換為給定的替換字串。

22 boolean requireEnd()

如果更多輸入可以將正匹配更改為負匹配,則返回 true。

23 Matcher reset()

重置此匹配器。

24 Matcher reset(CharSequence input)

使用新的輸入序列重置此匹配器。

25 int start()

返回上次匹配的起始索引。

26 int start(int group)

返回上次匹配操作期間由給定組捕獲的子序列的起始索引。

27 MatchResult toMatchResult()

將此匹配器的匹配狀態作為 MatchResult 返回。

28 String toString()

返回此匹配器的字串表示形式。

29 Matcher useAnchoringBounds(boolean b)

設定此匹配器的區域邊界的錨定。

30 Matcher usePattern(Pattern newPattern)

更改此 Matcher 用於查詢匹配項的 Pattern。

31 Matcher useTransparentBounds(boolean b)

設定此匹配器的區域邊界的透明性。

繼承的方法

此類繼承自以下類的方法:

  • java.lang.Object

Java 正則表示式 - PatternSyntaxException 類

介紹

`java.util.regex.PatternSyntaxException` 類表示丟擲的未經檢查的異常,用於指示正則表示式模式中的語法錯誤。

類宣告

以下是 `java.util.regex.PatternSyntaxException` 類的宣告:

public class PatternSyntaxException
   extends IllegalArgumentException

建構函式

序號 方法和描述
1 PatternSyntaxException(String desc, String regex, int index)

構造此類的新的例項。

類方法

序號 方法和描述
1 String getDescription()

檢索錯誤的描述。

2 int getIndex()

獲取錯誤索引。

3 String getMessage()

返回一個多行字串,包含語法錯誤的描述及其索引、錯誤的正則表示式模式以及模式中錯誤索引的視覺化指示。

4 String getPattern()

獲取錯誤的正則表示式模式。

繼承的方法

此類繼承自以下類的方法:

  • Java.lang.Throwable
  • java.lang.Object

示例

以下示例演示了 java.util.regex.Pattern.PatternSyntaxException 類方法的用法。

package com.tutorialspoint;

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

public class PatternSyntaxExceptionDemo {
   private static String REGEX = "[";
   private static String INPUT = "The dog says meow " + "All dogs say meow.";
   private static String REPLACE = "cat";

   public static void main(String[] args) {
      try{
         Pattern pattern = Pattern.compile(REGEX);
         
         // get a matcher object
         Matcher matcher = pattern.matcher(INPUT); 
         INPUT = matcher.replaceAll(REPLACE);
      } catch(PatternSyntaxException e){
         System.out.println("PatternSyntaxException: ");
         System.out.println("Description: "+ e.getDescription());
         System.out.println("Index: "+ e.getIndex());
         System.out.println("Message: "+ e.getMessage());
         System.out.println("Pattern: "+ e.getPattern());
      }
   }
}

讓我們編譯並執行上述程式,這將產生以下結果:

PatternSyntaxException: 
Description: Unclosed character class
Index: 0
Message: Unclosed character class near index 0
[
^
Pattern: [

Java 正則表示式 - 字元匹配示例

以下是使用 Java 中的正則表示式匹配字元的各種示例。

序號 構造 & 匹配
1 x

字元 x

2 \\

反斜槓字元

3 \0n

八進位制值為 0n 的字元 (0 ≤ n ≤ 7)

4 \0nn

八進位制值為 0nn 的字元 (0 ≤ n ≤ 7)

5 \0mnn

八進位制值為 0mnn 的字元 (0 ≤ m ≤ 3, 0 ≤ n ≤ 7)

6 \xhh

十六進位制值為 0xhh 的字元

7 \uhhhh

十六進位制值為 0xhhhh 的字元

8 \t

製表符 ('\u0009')

9 \n

換行符(換行符)字元 ('\u000A')

10 \r

回車符 ('\u000D')

11 \f

換頁符 ('\u000C')

Java 正則表示式 - 字元類匹配

以下是使用 Java 中的正則表示式匹配字元類的各種示例。

序號 構造 & 匹配
1 [abc]

a、b 或 c(簡單類)。

2 [^abc]

除 a、b 或 c 之外的任何字元(否定)。

3 [a-zA-Z]

a 到 z 或 A 到 Z,包括在內(範圍)。

4 [a-d[m-p]]

a 到 d,或 m 到 p:[a-dm-p](並集)。

5 [a-z&&[def]]

d、e 或 f(交集)。

6 [a-z&&[^bc]]

a 到 z,但 b 和 c 除外:[ad-z](減法)

7 [a-z&&[^m-p]]

a 到 z,且 m 到 p 除外:[a-lq-z](減法)。

匹配預定義字元類

以下是使用 Java 中的正則表示式匹配預定義字元類的各種示例。

序號 構造 & 匹配
1 .

任何字元(可能匹配也可能不匹配行終止符)。

2 \d

一個數字:[0-9]。

3 \D

一個非數字:[^0-9]。

4 \s

一個空白字元:[ \t\n\x0B\f\r]

5 \S

一個非空白字元:[^\s]。

6 \w

一個單詞字元:[a-zA-Z_0-9]。

7 \W

一個非單詞字元:[^\w]

匹配 POSIX 字元類

以下是使用 Java 中的正則表示式匹配 POSIX 字元類的各種示例。

序號 構造 & 匹配
1 \p{Lower}

一個小寫字母字元:[a-z]。

2 \p{Upper}

一個大寫字母字元:[A-Z]。

3 \p{ASCII}

所有 ASCII:[\x00-\x7F]。

4 \p{Alpha}

一個字母字元:[\p{Lower}\p{Upper}]。

5 \p{Digit}

一個十進位制數字:[0-9]。

6 \p{Alnum}

一個字母數字字元:[\p{Alpha}\p{Digit}]。

7 \p{Punct}

標點符號:!\"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ 中的一個。

8 \p{Graph}

一個可見字元:[\p{Alnum}\p{Punct}]。

9 \p{Print}

一個可列印字元:[\p{Graph}\x20]。

10 \p{Blank}

一個空格或製表符:[ \t]。

11 \p{XDigit}

一個十六進位制數字:[0-9a-fA-F]。

12 \p{Space}

一個空白字元:[ \t\n\x0B\f\r]。

匹配 JAVA 字元類

以下是使用 Java 中的正則表示式匹配 JAVA 字元類的各種示例。

序號 構造 & 匹配
1 \p{javaLowerCase}

等效於 java.lang.Character.isLowerCase()。

2 \p{javaUpperCase}

等效於 java.lang.Character.isUpperCase()。

3 \p{javaWhitespace}

等效於 java.lang.Character.isWhitespace()。

4 \p{javaMirrored}

等效於 java.lang.Character.isMirrored()。

匹配 Unicode 字元類

以下是使用 Java 中的正則表示式匹配 Unicode 字元類的各種示例。

序號 構造 & 匹配
1 \p{IsLatin}

一個拉丁文字元。

2 \p{InGreek}

希臘字母塊中的一個字元。

3 \p{Lu}

一個大寫字母。

4 \p{IsAlphabetic}

一個字母字元(二元屬性)。

5 \p{Sc}

一個貨幣符號。

6 \P{InGreek}

除希臘字母塊中的字元以外的任何字元。

7 [\p{L}&&[\p{Lu}]]

除大寫字母以外的任何字母。

邊界匹配器的示例

以下是使用 Java 中的正則表示式進行邊界匹配的各種示例。

序號 構造 & 匹配
1 ^

一行的開頭。

2 $

一行的結尾。

3 \b

一個單詞邊界。

4 \B

一個非單詞邊界。

5 \A

輸入的開頭。

6 \G

前一個匹配的結尾。

7 \Z

輸入的結尾,但對於最終終止符(如果有)除外。

8 \z

輸入的結尾。

Java 正則表示式的貪婪量詞

貪婪量詞指示搜尋引擎搜尋整個字串並檢查它是否與給定的正則表示式匹配。以下是使用 Java 中的正則表示式進行貪婪量詞匹配的各種示例。

序號 構造 & 匹配
1 X?

X,一次或根本不出現。

2 X*

X,零次或多次。

3 X+

X,一次或多次。

4 X{n}

X,恰好 n 次。

5 X{n,}

X,至少 n 次。

6 X{n,m}

X,至少 n 次,但不超過 m 次。

勉強量詞的示例

勉強量詞指示搜尋引擎從字串的最短可能部分開始。一旦找到匹配項,引擎就會繼續;否則,它會向正在檢查的字串部分新增一個字元並搜尋該部分,依此類推。此過程將持續進行,直到找到匹配項或使用完整個字串為止。以下是使用 Java 中的正則表示式進行勉強量詞匹配的各種示例。

序號 構造 & 匹配
1 X??

X,一次或根本不出現。

2 X*?

X,零次或多次。

3 X+?

X,一次或多次。

4 X{n}?

X,恰好 n 次。

5 X{n,}?

X,至少 n 次。

6 X{n,m}?

X,至少 n 次,但不超過 m 次。

獨佔量詞的示例

獨佔量詞類似於貪婪量詞。它指示引擎從檢查整個字串開始。不同之處在於,如果它不起作用,如果匹配失敗,則不會回溯。以下是使用 Java 中的正則表示式進行獨佔量詞匹配的各種示例。

序號 構造 & 匹配
1 X?+

X,一次或根本不出現。

2 X*+

X,零次或多次。

3 X++

X,一次或多次。

4 X{n}+

X,恰好 n 次。

5 X{n,}+

X,至少 n 次。

6 X{n,m}+

X,至少 n 次,但不超過 m 次。

Java 正則表示式 - 邏輯運算子示例

以下是使用 Java 中的正則表示式進行邏輯運算子匹配的各種示例。

序號 構造 & 匹配
1 XY

X 後跟 Y。

2 X|Y

X 或 Y。

列印
廣告