Java中的正则表达式
1. 正则表达式的基本概念
正则表达式(Regular Expression, regex)是一种用于匹配字符串中字符组合的模式。正则表达式广泛应用于字符串搜索、替换和解析。Java通过java.util.regex
包提供了对正则表达式的支持,该包包含两个主要的类:Pattern
和Matcher
。
2. 正则表达式的基本语法
正则表达式由普通字符(例如字符a
到z
)和特殊字符(或称为元字符)组成。元字符用于表示某种预定义的匹配模式。
2.1 常用元字符
- •
.
:匹配任意单个字符(除换行符)。 - •
*
:匹配零次或多次前面的字符。 - •
+
:匹配一次或多次前面的字符。 - •
?
:匹配零次或一次前面的字符。 - •
[]
:定义一个字符类。匹配方括号中的任意字符。 - •
^
:匹配字符串的开始。 - •
$
:匹配字符串的结束。 - •
|
:表示逻辑或(OR)操作。 - •
()
:用于分组和提取子字符串。
2.2 预定义字符类
- •
\d
:匹配任意一个数字字符(0-9)。 - •
\D
:匹配任意一个非数字字符。 - •
\w
:匹配任意一个字母、数字或下划线字符。 - •
\W
:匹配任意一个非字母、非数字、非下划线字符。 - •
\s
:匹配任意一个空白字符(空格、制表符等)。 - •
\S
:匹配任意一个非空白字符。
3. Pattern和Matcher类
3.1 Pattern类
Pattern
类用于编译正则表达式。正则表达式首先被编译为一个Pattern
对象,然后使用该对象创建一个Matcher
对象。
3.2 Matcher类
Matcher
类用于执行匹配操作。它提供了各种方法来检查是否匹配、查找匹配项以及替换文本等。
4. 正则表达式的使用示例
4.1 基本匹配
以下示例展示了如何使用正则表达式匹配一个字符串中的某个模式。
import java.util.regex.*;
public class RegexExample {
public static void main(String[] args) {
String text = "This is a sample text with number 12345 and special character $.";
String patternString = "\\d+";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
System.out.println("Found match: " + matcher.group());
}
}
}
在上述代码中,正则表达式\d+
用于匹配一个或多个连续的数字字符。Matcher
对象的find
方法用于查找文本中所有符合该模式的子字符串。
4.2 字符类
以下示例展示了如何使用字符类来匹配特定字符集合。
import java.util.regex.*;
public class RegexExample {
public static void main(String[] args) {
String text = "Sample text with various characters: abc ABC 123.";
String patternString = "[a-zA-Z]";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
System.out.println("Found match: " + matcher.group());
}
}
}
在上述代码中,正则表达式[a-zA-Z]
用于匹配所有字母字符,无论大小写。
4.3 分组
正则表达式支持分组功能,通过圆括号()
来定义分组。
import java.util.regex.*;
public class RegexExample {
public static void main(String[] args) {
String text = "John Doe, Jane Smith";
String patternString = "(\\w+)\\s+(\\w+)";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
System.out.println("Full match: " + matcher.group(0));
System.out.println("First name: " + matcher.group(1));
System.out.println("Last name: " + matcher.group(2));
}
}
}
在上述代码中,正则表达式(\\w+)\\s+(\\w+)
用于匹配名字和姓氏。分组捕获了名字和姓氏的不同部分,可以通过group
方法分别访问它们。
5. 常用的正则表达式操作
5.1 匹配整个字符串
使用matches
方法检查整个字符串是否完全匹配某个模式。
import java.util.regex.*;
public class RegexExample {
public static void main(String[] args) {
String text = "12345";
String patternString = "\\d+";
boolean matches = Pattern.matches(patternString, text);
System.out.println("Matches: " + matches); // 输出:Matches: true
}
}
5.2 查找和替换
使用replaceAll
方法替换所有匹配的子字符串。
import java.util.regex.*;
public class RegexExample {
public static void main(String[] args) {
String text = "John Doe, Jane Smith";
String patternString = "\\b(\\w+)(\\s+)(\\w+)\\b";
String replacement = "$3, $1";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(text);
String result = matcher.replaceAll(replacement);
System.out.println("Result: " + result); // 输出:Doe, John, Smith, Jane
}
}
在上述代码中,\\b(\\w+)(\\s+)(\\w+)\\b
用于匹配名字和姓氏,$3, $1
用于替换匹配的子字符串,调整名字和姓氏的顺序。
5.3 分割字符串
使用split
方法根据正则表达式分割字符串。
import java.util.regex.*;
public class RegexExample {
public static void main(String[] args) {
String text = "one,two,three,four";
String patternString = ",";
Pattern pattern = Pattern.compile(patternString);
String[] parts = pattern.split(text);
for (String part : parts) {
System.out.println("Part: " + part);
}
}
}
在上述代码中,逗号(,
)作为分隔符,split
方法将字符串分割成多个部分。
6. 复杂的正则表达式示例
6.1 验证电子邮件地址
以下正则表达式用于验证电子邮件地址的格式。
import java.util.regex.*;
public class RegexExample {
public static void main(String[] args) {
String[] emails = {
"user@example.com",
"user.name@domain.com",
"user-name@domain.co.in",
"user_name@domain.com",
"username@domain.c",
"username@domain.com",
"username@domain..com"
};
String patternString = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}$";
Pattern pattern = Pattern.compile(patternString);
for (String email : emails) {
Matcher matcher = pattern.matcher(email);
System.out.println(email + ": " + matcher.matches());
}
}
}
在上述代码中,正则表达式^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}$
用于验证电子邮件地址的格式。循环遍历多个电子邮件地址,检查它们是否符合该格式。
6.2 验证电话号码
以下正则表达式用于验证电话号码的格式(例如:123-456-7890)。
import java.util.regex.*;
public class RegexExample {
public static void main(String[] args) {
String[] phoneNumbers = {
"123-456-7890",
"123.456.7890",
"(123) 456-7890",
"123 456 7890",
"1234567890"
};
String patternString = "^(\\(\\d{3}\\)|\\d{3}[-.\\s]?)\\d{3}[-.\\s]?\\d{4}$";
Pattern pattern = Pattern.compile(patternString);
for (String phoneNumber : phoneNumbers) {
Matcher matcher = pattern.matcher(phoneNumber);
System.out.println(phoneNumber + ": " + matcher.matches());
}
}
}
在上述代码中,正则表达式^(\\(\\d{3}\\)|\\d{3}[-.\\s]?)\\d{3}[-.\\s]?\\d{4}$
用于验证电话号码的格式。循环遍历多个电话号码,检查它们是否符合该格式。