Java正则表达式
外观
Java正则表达式是一种强大的文本处理工具,用于在字符串中进行模式匹配、搜索和替换操作。它基于正则表达式(Regular Expression,简称Regex)语法,广泛应用于数据验证、日志分析、文本提取等场景。本文将详细介绍Java中正则表达式的语法、核心类库及实际应用。
概述[编辑 | 编辑源代码]
正则表达式是由普通字符(如字母、数字)和元字符(特殊符号)组成的字符串,用于定义搜索模式。Java通过
java.util.regex
包提供正则表达式支持,主要包含以下类:
- :编译后的正则表达式模式
Pattern
- :对输入字符串执行匹配操作的引擎
Matcher
基础语法[编辑 | 编辑源代码]
以下是常见元字符及其含义:
元字符 | 描述 |
---|---|
.
|
匹配任意单个字符(除换行符) |
\d
|
匹配数字(等价于[0-9]
|
\w
|
匹配单词字符(字母、数字、下划线) |
\s
|
匹配空白字符(空格、制表符等) |
^
|
匹配字符串开头 |
$
|
匹配字符串结尾 |
*
|
匹配前一个元素0次或多次 |
+
|
匹配前一个元素1次或多次 |
?
|
匹配前一个元素0次或1次 |
{n
|
精确匹配n次 |
字符类示例[编辑 | 编辑源代码]
// 检查字符串是否包含数字
String regex = "\\d+"; // 注意Java中需要转义反斜杠
String input = "Order123";
boolean matches = input.matches(".*" + regex + ".*");
System.out.println(matches); // 输出: true
核心API详解[编辑 | 编辑源代码]
Pattern类[编辑 | 编辑源代码]
通过
Pattern.compile()
方法创建编译后的正则表达式对象:
Pattern pattern = Pattern.compile("a*b"); // 匹配0个或多个a后接b
Matcher matcher = pattern.matcher("aaab");
boolean isMatch = matcher.matches(); // 完全匹配
System.out.println(isMatch); // 输出: true
Matcher类[编辑 | 编辑源代码]
提供丰富的匹配操作方法:
- :查找下一个匹配项
find()
- :返回匹配的字符串
group()
- :替换所有匹配项
replaceAll()
Pattern p = Pattern.compile("\\b\\w{4}\\b"); // 匹配4字母单词
Matcher m = p.matcher("Java regex is powerful");
while (m.find()) {
System.out.println(m.group()); // 输出: Java
}
分组与捕获[编辑 | 编辑源代码]
使用圆括号
()
创建捕获组:
String dateStr = "2023-12-25";
Pattern datePattern = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})");
Matcher dateMatcher = datePattern.matcher(dateStr);
if (dateMatcher.matches()) {
System.out.println("Year: " + dateMatcher.group(1)); // 2023
System.out.println("Month: " + dateMatcher.group(2)); // 12
System.out.println("Day: " + dateMatcher.group(3)); // 25
}
实际应用案例[编辑 | 编辑源代码]
案例1:邮箱验证[编辑 | 编辑源代码]
String emailRegex = "^[\\w.-]+@[\\w.-]+\\.[a-z]{2,6}$";
String email = "user@example.com";
System.out.println(email.matches(emailRegex)); // true
案例2:日志过滤[编辑 | 编辑源代码]
提取日志中的错误信息:
String log = "ERROR 2023-01-01: Disk full\nWARNING 2023-01-02: Memory low";
Pattern errorPattern = Pattern.compile("ERROR (\\d{4}-\\d{2}-\\d{2}): (.+)");
Matcher errorMatcher = errorPattern.matcher(log);
while (errorMatcher.find()) {
System.out.println("Error at " + errorMatcher.group(1) +
": " + errorMatcher.group(2));
}
// 输出: Error at 2023-01-01: Disk full
性能优化[编辑 | 编辑源代码]
正则表达式可能影响性能,建议:
1. 预编译常用模式(使用
Pattern.compile()
)
2. 避免过度复杂的嵌套匹配
3. 使用非捕获组
(?:...)
当不需要提取内容时
高级特性[编辑 | 编辑源代码]
零宽断言[编辑 | 编辑源代码]
匹配位置而不消耗字符:
- :正向先行断言
{{{1}}}
- :正向后行断言
{{{1}}}
// 匹配后面跟着"px"的数字
Pattern pxPattern = Pattern.compile("\\d+(?=px)");
Matcher pxMatcher = pxPattern.matcher("16px 24pt");
pxMatcher.find();
System.out.println(pxMatcher.group()); // 输出: 16
贪婪与懒惰匹配[编辑 | 编辑源代码]
默认贪婪匹配(尽可能多匹配),添加
?
变为懒惰匹配:
String html = "<div>content</div><p>text</p>";
Pattern greedy = Pattern.compile("<.*>"); // 匹配整个字符串
Pattern lazy = Pattern.compile("<.*?>"); // 匹配单个标签
可视化理解[编辑 | 编辑源代码]
数学表示[编辑 | 编辑源代码]
正则表达式可以形式化为: 其中:
- 表示空语言
- 表示空字符串
- 是字母表中的字符
- 表示连接
- 表示选择
- 表示Kleene闭包
常见问题[编辑 | 编辑源代码]
页面模块:Message box/ambox.css没有内容。
注意转义字符:Java字符串中需双重转义,例如匹配数字应写为 \\d
|
总结[编辑 | 编辑源代码]
Java正则表达式是处理文本的瑞士军刀,通过掌握: 1. 基础元字符语法 2. Pattern/Matcher API 3. 分组捕获机制 4. 性能优化策略 开发者可以高效解决复杂的文本处理问题。建议从简单模式开始练习,逐步掌握高级特性。