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);
}
}

在这个例子中,我们创建了一个匹配单词"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("animal");
System.out.println("替换后: " + result);
}
}

在这个例子中,我们将"fox"和"dog"都替换为"animal"。replaceAll()方法为我们完成了所有繁重的工作!

正则表达式 - PatternSyntaxException类

有时,我们在编写正则表达式时可能会犯错误。这时PatternSyntaxException类就派上用场了。当正则表达式模式中出现语法错误时,它会抛出异常。

public class PatternSyntaxExceptionExample {
public static void main(String[] args) {
try {
Pattern.compile("[");  // 无效的正则表达式
} catch (PatternSyntaxException e) {
System.out.println("正则表达式语法异常: " + e.getMessage());
System.out.println("错误索引: " + e.getIndex());
}
}
}

这段代码故意使用了一个无效的正则表达式来演示PatternSyntaxException是如何工作的。它就像是你正则表达式的内置校对员!

就是这些了,各位!我们已经穿越了Java正则表达式的领域,从基本模式到复杂替换。记住,像任何强大的工具一样,你越练习使用regex,它就越有用。所以不要害怕实验并创建你自己的模式。谁知道呢?你可能就会成为模式匹配的福尔摩斯!

编程愉快,愿你的字符串始终符合你的期望!

Credits: Image by storyset