当前位置: 首页 > news >正文

Java-正则表达式

正则表达式(Regular Expression)是处理字符串的强大工具,Java通过 java.util.regex 包提供支持。字符串的替换分解是正则表达式的两大核心应用场景。以下是详细讲解:


1. 正则表达式基础

正则表达式是一种描述字符串模式的语法,用于匹配、查找、替换或分割字符串。

1.1 常用元字符

元字符说明示例
.匹配任意字符(除换行符)a.c → "abc", "a c"
\d匹配数字(等价于 [0-9]\d+ → "123"
\w匹配单词字符(字母、数字、下划线)\w+ → "user_1"
\s匹配空白字符(空格、制表符等)a\sb → "a b"
^匹配字符串开头^Java → "Java is..."
$匹配字符串结尾end$ → "...end"
[]匹配括号内的任意字符[aeiou] → "a", "e"
``或操作`catdog` → "cat" 或 "dog"

1.2 量词

量词说明示例
*0次或多次a* → "", "a", "aa"
+1次或多次\d+ → "1", "123"
?0次或1次colou?r → "color", "colour"
{n}恰好n次a{2} → "aa"
{n,}至少n次a{2,} → "aa", "aaa"

2. 字符串的替换

2.1 String.replaceAll() 和 String.replaceFirst()

  • replaceAll(String regex, String replacement):替换所有匹配的子串。

  • replaceFirst(String regex, String replacement):替换第一个匹配的子串。

示例

String text = "Java 8, Java 11, Java 17";
String replacedAll = text.replaceAll("Java \\d+", "JDK"); // "JDK, JDK, JDK"
String replacedFirst = text.replaceFirst("Java \\d+", "JDK"); // "JDK, Java 11, Java 17"

2.2 使用捕获组

用 () 定义捕获组,通过 $n 引用(n为组号)。
示例:交换单词顺序

String text = "Hello World";
String swapped = text.replaceAll("(\\w+) (\\w+)", "$2 $1"); // "World Hello"

3. 字符串的分解(分割)

3.1 String.split()

根据正则表达式分割字符串,返回数组。
示例

String csv = "A,B,C,D";
String[] parts = csv.split(","); // ["A", "B", "C", "D"]// 复杂分割:按多个分隔符(逗号或分号)
String data = "A,B;C;D";
String[] items = data.split("[,;]"); // ["A", "B", "C", "D"]

3.2 处理空字符串

默认会删除末尾的空字符串,可通过限制参数保留:

String text = "A,B,,C,";
String[] parts1 = text.split(","); // ["A", "B", "", "C"]
String[] parts2 = text.split(",", -1); // ["A", "B", "", "C", ""]

4. 正则表达式的高级使用

4.1 Pattern 和 Matcher 类

用于复杂的匹配和提取操作。
示例:提取所有数字


import java.util.regex.*;String text = "Prices: $10, $20, $30";
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher(text);while (matcher.find()) {System.out.println(matcher.group()); // 输出:10, 20, 30
}

4.2 分组提取

通过捕获组提取特定部分。
示例:提取日期中的年、月、日

String date = "2023-10-05";
Pattern pattern = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})");
Matcher matcher = pattern.matcher(date);if (matcher.matches()) {String year = matcher.group(1); // "2023"String month = matcher.group(2); // "10"String day = matcher.group(3); // "05"
}

5. 常见应用场景

5.1 校验输入格式


// 校验邮箱格式
String email = "user@example.com";
boolean isValid = email.matches("\\w+@\\w+\\.\\w+"); // true

5.2 清理字符串

// 移除所有非字母字符
String dirty = "A1B2C3!";
String clean = dirty.replaceAll("[^A-Za-z]", ""); // "ABC"

5.3 复杂文本解析

// 从HTML中提取所有链接
String html = "<a href='https://example.com'>Link</a>";
Pattern linkPattern = Pattern.compile("href='(.*?)'");
Matcher linkMatcher = linkPattern.matcher(html);while (linkMatcher.find()) {System.out.println(linkMatcher.group(1)); // "https://example.com"
}

6. 性能优化建议

  1. 预编译正则表达式
    多次使用时,先编译 Pattern 对象以提高性能。

    Pattern pattern = Pattern.compile("\\d+"); // 预编译
    Matcher matcher = pattern.matcher(text);
  2. 避免贪婪量词
    使用 *? 或 +? 进行非贪婪匹配,避免过度匹配。

    String text = "<div>Content</div><div>More</div>";
    text.replaceAll("<div>(.*?)</div>", ""); // 非贪婪匹配
  3. 选择简单分隔符
    如果只需按固定字符分割,优先用 StringTokenizer 或 String.split() 的简单模式。


7. 总结

操作方法/类适用场景
替换replaceAll()replaceFirst()批量替换或单次替换
分割split()按正则表达式分解字符串
复杂匹配Pattern 和 Matcher提取、校验或多次匹配
高效处理预编译 Pattern频繁使用同一正则时提升性能

关键点

  • 正则表达式是字符串处理的瑞士军刀,但需注意性能。

  • 简单场景用 String 类方法,复杂场景用 Pattern/Matcher

  • 始终测试正则表达式(可用在线工具如 Regex101)。

http://www.lqws.cn/news/558073.html

相关文章:

  • 测量 Linux 中进程上下文切换需要的时间
  • cocos creator 3.8 - 精品源码 - 挪车超人(挪车消消乐)
  • 同步日志系统深度解析【链式调用】【宏定义】【固定缓冲区】【线程局部存储】【RAII】
  • 蚂蚁百宝箱体验:如何快速创建“旅游小助手”AI智能体
  • LINUX628 NFS 多web;主从dns;ntp;samba
  • AlphaGenome:基因组学领域的人工智能革命
  • Linux离线搭建Redis (centos7)详细操作步骤
  • 深入解析 Electron 核心模块:构建跨平台桌面应用的关键
  • 《Go语言高级编程》玩转RPC
  • Vue.js 中的 v-model 和 :value:理解父子组件的数据绑定
  • 网络 : 传输层【UDP协议】
  • (线性代数)矩阵的奇异值Singular Value
  • WPS之PPT镂空效果实现
  • 笔记07:网表的输出与导入
  • spring中maven缺少包如何重新加载,报错java: 程序包org.springframework.web.reactive.function不存在
  • FPGA产品
  • 深入理解Java四大引用:强引用、软引用、弱引用与虚引用
  • 2.2.3、CAN总线-位时间特性、中断
  • 开源项目推荐:MCP Registry——管理MCP服务器的利器
  • git 变基:git rebase
  • 使用cmake+vs2022编译win环境下grpc(不建议拉取最新版本grpc(注意本文时间是2025/6/28))
  • 解决clion远程编程发现不了部分头文件问题
  • 如何在FastAPI中打造坚不可摧的Web安全防线?
  • 前端打印计算单位 cm、mm、px
  • COLT_CMDB_linux_zookeeperInfo_20250628.sh
  • JavaScript正则表达式之正向先行断言(Positive Lookahead)深度解析
  • MCPA2APPT:基于 A2A+MCP+ADK 的多智能体流式并发高质量 PPT 智能生成系统
  • 数字孪生技术赋能UI前端:实现虚拟与现实的无缝对接
  • InfluxDB 3 Core数据库管理指南:从概念到实操的完整流程
  • 单元测试和集成测试的区别