Java - 常規表示式

歡迎您,有抱負的Java程式設計師!今天,我們將深入Java中的常規表示式(Regex)的迷人世界。如果您是程式設計新手,也別擔心;我會一步一步引導您完成這段旅程,就像過去多年來我指導無數學生一樣。所以,泡一杯咖啡,讓我們一起踏上這段令人興奮的冒險吧!

Java - Regular Expressions

常規表示式是什麼?

在我們深入研究Java的特定實現之前,先來了解常規表示式是什麼。想像您是一位偵探,試圖在文字的海洋中尋找特定的模式。這正是Regex的作用——它是一個強大的工具,用於字符串的模式匹配和操作。

Java常規表示式(Regex)類別

Java提供了一個名為java.util.regex的包,其中包含了多個用於處理常規表示式的類別。我們將重點關注的三個主要類別為:

  1. Pattern
  2. Matcher
  3. PatternSyntaxException

讓我們詳細探索每一個。

Pattern類別

Pattern類別表示常規表示式的編譯後表示形式。將其視為您的模式匹配偵探工作的藍圖。

import java.util.regex.Pattern;

public class PatternExample {
public static void main(String[] args) {
Pattern pattern = Pattern.compile("Hello");
System.out.println("創建的Pattern: " + pattern);
}
}

在這個例子中,我們創建了一個匹配單詞"Hello"的簡單模式。compile()方法將常規表示式作為字串並返回一個Pattern對象。

Matcher類別

Matcher類別才是真正發生魔法的地方。它根據一個Pattern對字符序列執行匹配操作。

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

public class MatcherExample {
public static void main(String[] args) {
String text = "Hello, World! Hello, Java!";
Pattern pattern = Pattern.compile("Hello");
Matcher matcher = pattern.matcher(text);

while (matcher.find()) {
System.out.println("在索引: " + matcher.start() + "找到匹配");
}
}
}

此代碼在給定的文字中搜尋模式"Hello",並列印出每個匹配的開始索引。這就像我們的偵探在文件中找到所有線索的出現一樣!

常規表示式語法

現在,讓我們學習一些創建更複雜模式的基礎語法。以下是常用元字符的表格:

元字符 描述
. 匹配任何單一字符
^ 匹配行的開頭
$ 匹配行的結尾
* 匹配零個或多個出現
+ 匹配一個或多個出現
? 匹配零個或一個出現
\d 匹配一個數字
\s 匹配一個空白字符
\w 匹配一個字字符(字母、數字或底線)

讓我們看看其中一些的實際操作:

public class RegexSyntaxExample {
public static void main(String[] args) {
String text = "The quick brown fox jumps over the lazy dog";

// 匹配以'q'開頭的單詞
Pattern pattern1 = Pattern.compile("\\bq\\w+");
Matcher matcher1 = pattern1.matcher(text);
if (matcher1.find()) {
System.out.println("以'q'開頭的單詞: " + matcher1.group());
}

// 匹配以'g'結尾的單詞
Pattern pattern2 = Pattern.compile("\\w+g\\b");
Matcher matcher2 = pattern2.matcher(text);
if (matcher2.find()) {
System.out.println("以'g'結尾的單詞: " + matcher2.group());
}
}
}

在這個例子中,我們使用\b來匹配單詞邊界,\w+來匹配一個或多個字字符,並將它們與'q'和'g'結合使用,以分別找到以'q'開頭和以'g'結尾的單詞。

在常規表示式中捕獲群組

捕獲群組允許您將多個字符視為單一單位。它們通過將要分組的字符放在括號內創建。

public class CapturingGroupExample {
public static void main(String[] args) {
String text = "John Doe ([email protected])";
Pattern pattern = Pattern.compile("(\\w+)\\s(\\w+)\\s\\((\\w+@\\w+\\.\\w+)\\)");
Matcher matcher = pattern.matcher(text);

if (matcher.find()) {
System.out.println("名字: " + matcher.group(1));
System.out.println("姓氏: " + matcher.group(2));
System.out.println("電子郵件: " + matcher.group(3));
}
}
}

在這個例子中,我們從字串中提取了一個人的名字、姓氏和電子郵件地址。模式中的括號創建了捕獲群組,我們可以使用matcher.group(n)來訪問它們。

常規表示式 - Matcher類別方法

Matcher類別提供了多個有用的方法。以下是一些最常使用的:

方法 描述
find() 查找模式的下一個匹配
group() 返回匹配的子字串
start() 返回匹配的開始索引
end() 返回匹配的結束索引
matches() 檢查整個字串是否與模式匹配

讓我們看看這些方法的實際操作:

public class MatcherMethodsExample {
public static void main(String[] args) {
String text = "The rain in Spain falls mainly on the plain";
Pattern pattern = Pattern.compile("\\b\\w+ain\\b");
Matcher matcher = pattern.matcher(text);

while (matcher.find()) {
System.out.println("找到: " + matcher.group());
System.out.println("開始索引: " + matcher.start());
System.out.println("結束索引: " + matcher.end());
}
}
}

此代碼找到所有以"ain"結尾的單詞,並列印出每個匹配及其開始和結束索引。

常規表示式 - 替換方法

常規表示式不僅用於查找模式;它們還非常擅長於替換文字。Matcher類別提供了此目的的方法:

public class ReplacementExample {
public static void main(String[] args) {
String text = "The quick brown fox jumps over the lazy dog";
Pattern pattern = Pattern.compile("fox|dog");
Matcher matcher = pattern.matcher(text);

String result = matcher.replaceAll("動物");
System.out.println("替換後: " + result);
}
}

在這個例子中,我們將"fox"和"dog"都替換為"動物"。replaceAll()方法為我們完成了所有繁重的工作!

常規表示式 - PatternSyntaxException類別

有時,我們在編寫常規表示式時可能會犯錯誤。這就是PatternSyntaxException類別派上用場的地方。當常規表示式模式中出現語法錯誤時,它會被拋出。

public class PatternSyntaxExceptionExample {
public static void main(String[] args) {
try {
Pattern.compile("[");  // 無效的regex
} catch (PatternSyntaxException e) {
System.out.println("Pattern語法異常: " + e.getMessage());
System.out.println("錯誤索引: " + e.getIndex());
}
}
}

此代碼故意使用無效的regex來演示PatternSyntaxException如何工作。這就像為您的常規表示式提供了一個內置的校對員!

就是這樣,各位!我們已經穿越了Java常規表示式的領域,從基本的模式到複雜的替換。請記住,就像任何強大的工具一樣,regex您使用的越多,它就越有用。所以不要害怕實驗並創建自己的模式。誰知道呢?您可能會成為模式匹配的福爾摩斯!

編程愉快,願您的字串永遠符合您的期望!

Credits: Image by storyset