Java - 常規表示式
歡迎您,有抱負的Java程式設計師!今天,我們將深入Java中的常規表示式(Regex)的迷人世界。如果您是程式設計新手,也別擔心;我會一步一步引導您完成這段旅程,就像過去多年來我指導無數學生一樣。所以,泡一杯咖啡,讓我們一起踏上這段令人興奮的冒險吧!
常規表示式是什麼?
在我們深入研究Java的特定實現之前,先來了解常規表示式是什麼。想像您是一位偵探,試圖在文字的海洋中尋找特定的模式。這正是Regex的作用——它是一個強大的工具,用於字符串的模式匹配和操作。
Java常規表示式(Regex)類別
Java提供了一個名為java.util.regex
的包,其中包含了多個用於處理常規表示式的類別。我們將重點關注的三個主要類別為:
- Pattern
- Matcher
- 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