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

《Java高级编程:从原理到实战 - 进阶知识篇二》

一. 正则表达式基础

1.1 基本概念

  • 正则表达式:用于描述字符串模式的特殊语法

  • 用途:字符串匹配、查找、替换、分割等操作

  • Java实现java.util.regex

1.2 核心类

  • Pattern:编译后的正则表达式模式(不可变、线程安全)

  • Matcher:通过解释Pattern对字符序列执行匹配操作的引擎

二. 正则表达式语法

2.1 字符匹配

表达式说明示例
.匹配任意单个字符(除换行符)a.c匹配"abc"
\d数字[0-9]\d\d匹配"12"
\D非数字[^0-9]\D匹配"a"
\w单词字符[a-zA-Z_0-9]\w+匹配单词
\W非单词字符[^\w]\W匹配"@"
\s空白字符[\t\n\x0B\f\r]\s匹配空格
\S非空白字符[^\s]\S匹配"a"

2.2 数量限定符

表达式说明示例
*0次或多次a*b匹配"b","ab","aab"
+1次或多次a+b匹配"ab","aab"
?0次或1次a?b匹配"b","ab"
{n}恰好n次a{2}匹配"aa"
{n,}至少n次a{2,}匹配"aa","aaa"
{n,m}n到m次a{2,4}匹配"aa","aaa","aaaa"

2.3 位置匹配

表达式说明示例
^行/字符串开始^Java匹配以"Java"开头的行
$行/字符串结束end$匹配以"end"结尾的行
\b单词边界\bJava\b匹配独立的"Java"单词
\B非单词边界\Bend\B匹配"weekend"中的"end"

2.4 分组与捕获

表达式说明示例
(pattern)捕获分组(ab)+匹配"abab"
(?:pattern)非捕获分组(?:ab)+匹配但不捕获
(?<name>pattern)命名捕获组(?<year>\d{4})捕获为year组

三. Java正则API使用

3.1 基本使用步骤

// 1. 编译正则表达式
Pattern pattern = Pattern.compile("正则表达式");// 2. 创建匹配器
Matcher matcher = pattern.matcher("输入字符串");// 3. 执行匹配操作
boolean isMatch = matcher.matches(); // 或find(), group()等

3.2 常用方法

方法说明
Pattern.compile(String regex)编译正则表达式
matcher(CharSequence input)创建匹配器
matches()尝试将整个区域与模式匹配
find()查找下一个匹配的子序列
group()返回前一次匹配的子序列
group(int group)返回指定捕获组匹配的子序列
start()/end()返回匹配的起始/结束索引
replaceAll(String replacement)替换所有匹配项

3.3 常用模式标志

标志说明
Pattern.CASE_INSENSITIVE不区分大小写匹配
Pattern.MULTILINE多行模式(^和$匹配行首行尾)
Pattern.DOTALL.匹配任何字符包括行终止符
Pattern.UNICODE_CASEUnicode感知的大小写折叠

四. 常见应用示例

4.1 验证格式

// 验证邮箱
boolean isValidEmail = Pattern.matches("\\w+@\\w+\\.\\w+", "test@example.com");// 验证手机号(中国)
String phoneRegex = "1[3-9]\\d{9}";
boolean isValidPhone = "13812345678".matches(phoneRegex);

4.2 提取信息

Pattern datePattern = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})");
Matcher matcher = datePattern.matcher("2023-06-15");
if (matcher.find()) {String year = matcher.group(1);  // "2023"String month = matcher.group(2); // "06"String day = matcher.group(3);   // "15"
}

4.3 替换文本

String text = "foo123bar456baz";
String replaced = text.replaceAll("\\d+", "NUM"); // "fooNUMbarNUMbaz"

4.4 分割字符串

String[] parts = "one,two,three".split("\\s*,\\s*"); // ["one", "two", "three"]

五. 高级特性

5.1 零宽断言

表达式说明
(?=pattern)正向先行断言(后面跟着pattern)
(?!pattern)负向先行断言(后面不跟pattern)
(?<=pattern)正向后行断言(前面是pattern)
(?<!pattern)负向后行断言(前面不是pattern)

5.2 贪婪/懒惰/独占模式

模式表示法说明
贪婪X*尽可能多匹配(默认)
懒惰X*?尽可能少匹配
独占X*+尽可能多匹配且不回溯

六. 性能优化建议

  1. 预编译Pattern:多次使用的正则表达式应该预编译

  2. 避免复杂回溯:减少嵌套的量词和或操作

  3. 使用非捕获组:不需要捕获时使用(?:pattern)

  4. 合理使用边界:用\b等提高匹配效率

  5. 避免过度使用:简单字符串操作可用String方法替代

 

相关文章:

  • spring源码学习之一-----spring依赖包作用分析
  • 【Machine Learning Q and AI 读书笔记】- 04 彩票假设
  • 单片机-89C51部分:12 pwm 呼吸灯 直流电机
  • 【Shell 脚本编程】详细指南:第一章 - 基础入门与最佳实践
  • 类比分析AI Agent 技术
  • Python实现简易博客系统
  • Linux 第六讲 --- 工具篇(一)yum/apt与vim
  • 一个linux系统电脑,一个windows电脑,怎么实现某一个文件夹共享
  • 部署企业网站内部导航 Team-Nav 2.0
  • MCAL学习(1)——AutoSAR
  • OpenGL-ES 学习(12) ---- GPU 系统结构
  • RAG工程-基于LangChain 实现 Advanced RAG(预检索-查询优化)(上)
  • 类和对象(拷贝构造和运算符重载)下
  • 脑机接口技术:开启人类与机器的全新交互时代
  • jupyter notebook汉化教程
  • 【RocketMQ 生产者消费者】- 同步、异步、单向发送消费消息
  • SIEMENS PLC程序代码 赋值 + 判断
  • 操作系统(1)多线程
  • CMake管理外部依赖的模块
  • 极大电视 0.0.5.2| 基于Web的电视直播应用,提供高清、流畅的央视频道和各大卫视直播,完全免费无广告
  • 旅游特种兵们,这个五一“躲进”书吧
  • 特朗普称将禁止伊朗石油买家与美国做生意
  • 李开复出任福耀科技大学理事会理事,助力学校AI战略
  • 结婚这件事,年轻人到底怎么想的?
  • “铁血防守”制造8年最快丢球,恐惧中的阿森纳什么也做不了
  • 证据公布!菲律宾6人非法登上铁线礁活动