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}$
用于验证电话号码的格式。循环遍历多个电话号码,检查它们是否符合该格式。