正则表达式的基本概念
正则表达式(Regular Expression,简称Regex)是一种用于描述字符串模式的强大工具,它通过特定的语法规则定义字符组合,从而实现字符串的匹配、查找、替换等操作,在Java中,正则表达式广泛应用于表单验证、文本解析、数据清洗等场景,能够高效处理复杂的字符串逻辑,理解Java中正则表达式的定义方式,是掌握字符串处理的关键一步。
Java正则表达式的定义语法
在Java中,正则表达式以字符串形式定义,其语法遵循国际标准,主要由字符类、量词、预定义字符、边界匹配符和分组等核心元素构成,掌握这些语法规则,是正确定义正则表达式的基础。
字符类:匹配特定范围的字符
字符类用于指定一组可能的字符,通过方括号[]表示。
[abc]:匹配字符a、b或c中的任意一个;[a-z]:匹配任意小写字母;[0-9]:匹配任意数字(等同于\d);[^a-z]:匹配除小写字母外的任意字符(^表示取反)。
量词:控制字符出现的次数
量词用于修饰前面的字符或字符类,指定其出现的次数:
- 匹配0次或多次(如
a*可匹配空字符串、a、aa等); - 匹配1次或多次(如
a+至少匹配1个a); - 匹配0次或1次(如
a?可匹配空字符串或a); {n}:匹配恰好n次(如\d{3}匹配3位数字);{n,}:匹配至少n次(如\d{2,}匹配2位及以上数字);{n,m}:匹配n到m次(如\d{1,3}匹配1到3位数字)。
预定义字符:简化常用匹配规则
预定义字符(元字符)代表特定字符集合,提升正则表达式的简洁性:
\d:匹配任意数字(等同于[0-9]);\w:匹配单词字符(字母、数字、下划线,等同于[a-zA-Z0-9_]);\s:匹配空白字符(空格、制表符、换行符等);- 匹配除换行符外的任意字符(需配合
re.DOTALL模式可匹配换行符)。
边界匹配符:限定匹配位置
边界匹配符用于指定匹配发生的位置:
^:匹配字符串开头(如^abc要求字符串以abc开头);- 匹配字符串结尾(如
abc$要求字符串以abc; \b:匹配单词边界(如\bword\b匹配独立的单词word);\B:匹配非单词边界(如\Bword\B匹配单词中间的word)。
分组与选择:组合复杂逻辑
- 分组:通过圆括号将多个字符组合为一个整体,并可应用量词(如
(abc)+匹配abc、abcabc等); - 选择:使用竖线表示“或”逻辑(如
a|b匹配a或b); - 非捕获组:仅分组但不捕获匹配内容,提升性能(如
(?:a|b)+匹配a或b的多次组合,但不保存分组结果)。
Java中正则表达式的核心类与使用
Java通过java.util.regex包提供正则表达式支持,核心类包括Pattern和Matcher,二者配合实现正则表达式的编译与匹配。
Pattern类:编译正则表达式
Pattern类用于将正则表达式字符串编译为可匹配的模式对象,其静态方法compile()是入口:
Pattern pattern = Pattern.compile("\\d{3}-\\d{4}"); // 编译正则表达式,匹配3位数字-4位数字
编译时需注意:Java字符串中反斜杠\需转义为\\(如\d在字符串中写作\\d)。
Matcher类:执行匹配操作
Matcher类是执行匹配工作的引擎,通过Pattern.matcher()方法获取:
Matcher matcher = pattern.matcher("123-4567"); // 对目标字符串进行匹配
常用方法包括:
matches():匹配整个字符串,要求完全符合正则表达式(如matcher.matches()返回true);find():查找字符串中符合正则表达式的子串(可多次调用,定位下一个匹配);group():获取当前匹配的子串(group(0)表示完整匹配,group(1)获取第一个分组内容);replaceAll():替换所有匹配的子串(如matcher.replaceAll("-")替换为)。
实际应用场景示例
验证邮箱格式
String email = "user@example.com";
Pattern pattern = Pattern.compile("^[\\w.-]+@[\\w.-]+\\.[a-zA-Z]{2,}$");
Matcher matcher = pattern.matcher(email);
System.out.println("邮箱格式是否正确: " + matcher.matches()); // 输出true
提取文本中的手机号
String text = "联系电话:13812345678,备用电话:13987654321";
Pattern pattern = Pattern.compile("1[3-9]\\d{9}");
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
System.out.println("找到手机号:" + matcher.group()); // 输出13812345678和13987654321
}
替换敏感词
String content = "这是一个测试文本,包含敏感词badword。";
Pattern pattern = Pattern.compile("badword");
Matcher matcher = pattern.matcher(content);
String result = matcher.replaceAll("***");
System.out.println(result); // 输出:这是一个测试文本,包含敏感词***。
注意事项
- 预编译提升性能:频繁使用的正则表达式应通过
Pattern.compile()预编译,避免重复解析字符串; - 贪婪模式与非贪婪模式:默认量词为贪婪模式(匹配尽可能多的字符),可通过在量词后加转为非贪婪模式(如匹配尽可能少的字符);
- 转义特殊字符:若需匹配正则表达式中的特殊字符(如、等),需使用反斜杠转义(如
\.匹配); - 分组编号:分组按左括号顺序编号,嵌套分组时外层编号优先,合理使用非捕获组可减少不必要的内存消耗。
通过掌握Java中正则表达式的定义语法、核心类及实际应用,开发者能够高效处理字符串匹配、验证和转换等任务,提升代码的简洁性和执行效率,正则表达式虽语法复杂,但通过大量练习和场景实践,可逐步成为Java开发中的得力工具。













