正则表达式(Regular Expression,简称 RegexRegExp)是一种用于描述字符串模式的工具,广泛应用于字符串的匹配、搜索、替换和验证等操作。它通过特定的语法规则来匹配字符串中的特定模式。

Java 中,正则表达式是通过 java.util.regex 包中的 PatternMatcher 类来实现的。


正则表达式的基本构成

1. 字符匹配

  • . : 匹配任意一个字符(除了换行符)
  • \d : 匹配一个数字字符,等价于 [0-9]
  • \D : 匹配非数字字符,等价于 [^0-9]
  • \w : 匹配一个字母、数字或下划线字符,等价于 [a-zA-Z0-9_]
  • \W : 匹配非字母、数字或下划线字符,等价于 [^a-zA-Z0-9_]
  • \s : 匹配一个空白字符(如空格、制表符、换行符等)
  • \S : 匹配一个非空白字符
  • \b : 匹配单词边界
  • \B : 匹配非单词边界

2. 量词

  • * : 匹配前面的字符零次或多次
  • + : 匹配前面的字符一次或多次
  • ? : 匹配前面的字符零次或一次
  • {n} : 匹配前面字符恰好 n 次
  • {n,} : 匹配前面字符至少 n 次
  • {n,m} : 匹配前面字符至少 n 次,至多 m 次

3. 字符集与范围

  • [abc] : 匹配字符 abc 中的任意一个字符
  • [^abc] : 匹配除 abc 以外的任意字符
  • [a-z] : 匹配小写字母中的任意一个字符
  • [A-Z] : 匹配大写字母中的任意一个字符
  • [0-9] : 匹配数字中的任意一个字符

4. 分组与选择

  • () : 用于分组匹配
  • | : 表示“或”操作,匹配左边或右边的表达式

5. 其他特殊字符

  • \ : 转义字符,用于转义特殊字符(如 .*+ 等)
  • ^ : 匹配输入的开始位置
  • $ : 匹配输入的结束位置

Java 中正则表达式的应用

1. 使用 Pattern

Pattern 类代表了一个正则表达式,并提供了许多方法来对字符串进行匹配操作。它是正则表达式操作的核心。

2. 使用 Matcher

Matcher 类用于执行与正则表达式相关的匹配操作,如查找、替换、验证等。

3. 常用方法

方法 说明
Pattern.compile(String regex) 编译一个正则表达式,返回一个 Pattern 对象
matcher.find() 查找匹配的字符串
matcher.group() 获取匹配的子字符串
matcher.matches() 检查整个字符串是否与正则表达式匹配
matcher.replaceAll(String replacement) 替换所有匹配的部分

示例:正则表达式的使用

1. 判断字符串是否匹配正则表达式

1
2
3
4
5
6
7
8
9
10
11
import java.util.regex.Pattern;

public class RegexExample {
public static void main(String[] args) {
String regex = "^\\d{3}-\\d{2}-\\d{4}$"; // 社会安全号码(SSN)格式
String input = "123-45-6789";

boolean matches = Pattern.matches(regex, input);
System.out.println("匹配结果: " + matches);
}
}
  • 解释:这个正则表达式检查是否为一个有效的社会安全号码格式(例如:123-45-6789)。^ 表示字符串开始,\d{3} 表示三位数字,- 匹配一个连字符,\d{2} 表示两位数字,最后的 \d{4} 表示四位数字,$ 表示字符串结束。

2. 使用 PatternMatcher 查找匹配内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexExample {
public static void main(String[] args) {
String regex = "\\b\\w+\\b"; // 匹配单词
String input = "Hello, how are you?";

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);

while (matcher.find()) {
System.out.println("找到单词: " + matcher.group());
}
}
}
  • 解释:这个正则表达式匹配字符串中的每个单词(由字母、数字或下划线组成)。\\b 是单词边界,\\w+ 匹配一个或多个字母、数字或下划线。

3. 替换匹配的部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexExample {
public static void main(String[] args) {
String regex = "\\d+"; // 匹配数字
String input = "I have 2 apples and 10 oranges.";

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);

String result = matcher.replaceAll("many"); // 替换数字为 "many"
System.out.println("替换后的字符串: " + result);
}
}
  • 解释:在这个示例中,正则表达式 \\d+ 匹配字符串中的所有数字,并将其替换为 "many"

总结

正则表达式是一个强大且灵活的工具,在处理字符串匹配、替换和验证时非常有用。Java 提供了 PatternMatcher 类来实现正则表达式的匹配操作。通过掌握常见的正则语法和 Java 中的操作方法,你可以更加高效地处理字符串相关的任务。