跳转到内容

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("<.*?>");   // 匹配单个标签

可视化理解[编辑 | 编辑源代码]

graph LR A[输入字符串] --> B(Pattern编译) B --> C[创建Matcher] C --> D{匹配成功?} D -->|是| E[获取匹配结果] D -->|否| F[处理失败]

数学表示[编辑 | 编辑源代码]

正则表达式可以形式化为: R::=|ϵ|a|RR|RR|R* 其中:

  • 表示空语言
  • ϵ 表示空字符串
  • a 是字母表中的字符
  • 表示连接
  • 表示选择
  • * 表示Kleene闭包

常见问题[编辑 | 编辑源代码]

页面模块:Message box/ambox.css没有内容。

模板:Tip

总结[编辑 | 编辑源代码]

Java正则表达式是处理文本的瑞士军刀,通过掌握: 1. 基础元字符语法 2. Pattern/Matcher API 3. 分组捕获机制 4. 性能优化策略 开发者可以高效解决复杂的文本处理问题。建议从简单模式开始练习,逐步掌握高级特性。