如何掌握 Java 正则表达式 的基本语法及在 Java 中的应用

正则表达式是一种用于匹配字符串的模式,在许多编程语言中广泛使用。Java 正则表达式提供了强大的文本处理能力,能够对字符串进行查找、替换、分割等操作。

一、正则表达式的基本语法

正则表达式由普通字符和特殊字符组成。普通字符包括字母、数字和标点符号,而特殊字符(也称为元字符)则具有特殊意义,用于构建复杂的匹配模式。

1.1 普通字符

普通字符匹配自身。例如,正则表达式 abc 匹配字符串 "abc"

1.2 元字符

元字符是正则表达式的核心部分,用于定义复杂的匹配模式。常见的元字符包括:

  • .:匹配任意一个字符(除换行符)。
  • ^:匹配字符串的开始。
  • $:匹配字符串的结束。
  • *:匹配前一个字符零次或多次。
  • +:匹配前一个字符一次或多次。
  • ?:匹配前一个字符零次或一次。
  • []:定义字符类,匹配其中任意一个字符。
  • |:表示“或”操作。
  • ():用于分组和捕获。
  • {}:用于限定重复次数。

1.3 转义字符

有些字符在正则表达式中有特殊意义,如果要匹配这些字符本身,需要使用反斜杠 \ 进行转义。例如,要匹配字符 .,应使用 \.

1.4 字符类

字符类用于定义一个字符集合,匹配其中任意一个字符。常用的字符类包括:

  • [abc]:匹配字符 abc
  • [a-z]:匹配任意一个小写字母。
  • [A-Z]:匹配任意一个大写字母。
  • [0-9]:匹配任意一个数字。
  • [^abc]:匹配除 abc 之外的任意一个字符。

1.5 预定义字符类

预定义字符类是一些常用字符类的简写形式,包括:

  • \d:匹配一个数字,等价于 [0-9]
  • \D:匹配一个非数字字符,等价于 [^0-9]
  • \w:匹配一个单词字符(字母、数字或下划线),等价于 [a-zA-Z0-9_]
  • \W:匹配一个非单词字符,等价于 [^a-zA-Z0-9_]
  • \s:匹配一个空白字符(空格、制表符、换行符等),等价于 [ \t\n\x0B\f\r]
  • \S:匹配一个非空白字符,等价于 [^ \t\n\x0B\f\r]

1.6 边界匹配符

边界匹配符用于匹配字符串中的边界位置,包括:

  • \b:匹配一个单词边界。
  • \B:匹配一个非单词边界。

1.7 限定符

限定符用于指定前一个字符或子模式的重复次数,包括:

  • *:匹配前一个字符零次或多次。
  • +:匹配前一个字符一次或多次。
  • ?:匹配前一个字符零次或一次。
  • {n}:匹配前一个字符恰好 n 次。
  • {n,}:匹配前一个字符至少 n 次。
  • {n,m}:匹配前一个字符至少 n 次,至多 m 次。

1.8 捕获组和非捕获组

捕获组用于将匹配的子模式存储起来,以便在后续操作中引用。非捕获组用于对子模式进行分组,但不存储匹配结果。

  • ():捕获组。
  • (?:):非捕获组。

1.9 零宽断言

零宽断言用于指定某个位置必须满足的条件,包括:

  • (?=):正向先行断言。
  • (?!:负向先行断言。
  • (?<=):正向后行断言。
  • (?<!:负向后行断言。

二、Java 中的正则表达式 API

Java 提供了 java.util.regex 包来支持正则表达式处理,其中最重要的类是 PatternMatcher

2.1 Pattern

Pattern 类表示一个正则表达式的编译表示。常用的方法包括:

  • compile(String regex):编译给定的正则表达式。
  • matcher(CharSequence input):创建一个匹配器对象。

2.2 Matcher

Matcher 类用于对输入字符串进行模式匹配操作。常用的方法包括:

  • matches():整个字符串是否与正则表达式匹配。
  • find():是否找到与正则表达式匹配的子字符串。
  • group():返回前一次匹配的子字符串。
  • replaceAll(String replacement):替换所有匹配的子字符串。
  • replaceFirst(String replacement):替换第一个匹配的子字符串。
  • lookingAt():是否从字符串的开头开始匹配。

三、Java 正则表达式的常见用法

3.1 字符串匹配

3.1.1 完全匹配

要判断字符串是否完全匹配某个正则表达式,可以使用 PatternMatcher 类:

String regex = "\\d+";
String input = "12345";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
boolean isMatch = matcher.matches();
System.out.println("完全匹配: " + isMatch);
3.1.2 子字符串匹配

要判断字符串中是否包含某个正则表达式匹配的子字符串,可以使用 find 方法:

String regex = "\\d+";
String input = "hello 12345 world";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
boolean found = matcher.find();
System.out.println("包含子字符串匹配: " + found);

3.2 字符串替换

正则表达式可以用于替换字符串中的匹配部分。replaceAllreplaceFirst 方法用于替换所有匹配的子字符串或第一个匹配的子字符串:

String regex = "\\d+";
String input = "hello 12345 world";
String replacement = "number";
String result = input.replaceAll(regex, replacement);
System.out.println("替换结果: " + result);

3.3 字符串分割

正则表达式可以用于根据模式分割字符串。String 类提供了 split 方法:

String regex = "\\s+";
String input = "hello   world   java";
String[] parts = input.split(regex);
System.out.println("分割结果: " + Arrays.toString(parts));

3.4 捕获组

捕获组用于将匹配的子模式存储起来,以便在后续操作中引用。可以使用 group 方法获取捕获组的内容:

String regex = "(\\d{3})-(\\d{2})-(\\d{4})";
String input = "123-45-6789";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
if (matcher.matches()) {
    String part1 = matcher.group(1);
    String part2 = matcher.group(2);
    String part3 = matcher.group(3);
    System.out.println("捕获组: " + part1 + ", " + part2 + ", " + part3);
}

3.5 零宽断言

零宽断言用于指定某个位置必须满足的条件,但不包括在匹配结果中。以下示例展示了正向先行断言:

String regex = "foo(?=bar)";
String input = "foobar";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
    System.out.println("零宽断言匹配: " + matcher.group());
}

四、Java 正则表达式高级应用

4.1 动态构建正则表达式

有时我们需要根据不同的输入动态构建正则表达式。可以使用 StringBuilder 来拼接正则表达式:

String basePattern = "\\d";
int minDigits = 2;
int maxDigits = 4;
StringBuilder regex = new StringBuilder(basePattern);
regex.append("{").append(minDigits).append(",").append(maxDigits).append("}");
Pattern pattern = Pattern.compile(regex.toString());
String input = "123";
Matcher matcher = pattern.matcher(input);
boolean isMatch = matcher.matches();
System.out.println("动态构建正则表达式匹配: " + isMatch);

4.2 正则表达式中的嵌套组

嵌套组用于在一个捕获组内再嵌套另一个捕获组,以下示例展示了嵌套组的用法:

String regex = "(\\d{2})((\\d{2}))";
String input = "1234";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
if (matcher.matches()) {
    String outerGroup = matcher.group(1);
    String nestedGroup = matcher.group(2);
    String innermostGroup = matcher.group(3);
    System.out.println("外部组: " + outerGroup + ", 嵌套组: " + nestedGroup + ", 最内部组: " + innermostGroup);
}

4.3 分组命名和引用

Java 7 引入了分组命名功能,可以给捕获组命名,并通过名字引用:

String regex = "(?<areaCode>\\d{3})-(?<prefix>\\d{3})-(?<lineNumber>\\d{4})";
String input = "123-456-7890";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
if (matcher.matches()) {
    String areaCode = matcher.group("areaCode");
    String prefix = matcher.group("prefix");
    String lineNumber = matcher.group("lineNumber");
    System.out.println("命名捕获组: " + areaCode + ", " + prefix + ", " + lineNumber);
}

4.4 正则表达式的性能优化

在处理大型文本或复杂模式时,正则表达式的性能可能成为瓶颈。以下是一些性能优化建议:

  • 避免回溯:尽量避免使用可能导致大量回溯的模式,如重复的捕获组。
  • 预编译正则表达式:将正则表达式编译为 Pattern 对象,并重用该对象,而不是每次都重新编译。
  • 使用非捕获组:在不需要捕获匹配内容时,使用非捕获组 (?:) 代替捕获组 ()

4.5 正则表达式调试

调试正则表达式可能比较困难,可以使用在线工具(如 regex101)或集成开发环境(IDE)中的正则表达式调试功能来帮助理解和测试正则表达式。

掌握正则表达式可以大大提高文本处理的效率和灵活性,Java 提供的正则表达式 API 使得在程序中使用正则表达式变得简单高效。

黑马程序员免费预约咨询

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/687007.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Android】主界面设置-封装

在bulid文件写网址 implementation("io.github.youth5201314:banner:2.2.1") 添加主界面图片 些内容 在界面有图片&#xff0c;相同的属性封装起来 在values新建 先写风格&#xff0c;&#xff0c;再写代码 先写好这几项&#xff0c;宽高比例位置 将相同的属性…

软硬件集成项目,这个项目管理软件做的成本预算管理深得我心

最近&#xff0c;我负责了一个中大型的软硬件集成的项目&#xff0c;是对某单位的车间进行智能化改造&#xff0c;以提高生产效率&#xff0c;要确保设备运行的稳定性和安全性。项目会涉及到大量的硬件采购、安装以及多个软件的开发、集成&#xff0c;所以在实施过程中遇到了多…

【Python】实现极致:克服PyInstaller打包挑战,解决libpython3.10.so.1.0库丢失难题

【Python】实现极致&#xff1a;克服PyInstaller打包挑战&#xff0c;解决libpython3.10.so.1.0库丢失难题 大家好 我是寸铁&#x1f44a; 总结了一篇【Python】实现极致&#xff1a;克服PyInstaller打包挑战&#xff0c;解决libpython3.10.so.1.0库丢失难题✨ 喜欢的小伙伴可以…

微软必应地图的三维实景功能

偶然看到微软必应地图的三维实景功能&#xff0c;由于比较感兴趣这方面的技术&#xff0c;所以试用了一下,感觉总体来说技术上比咱们自己的技术和设计要好很多。比如这个工具栏就设计的很简洁&#xff0c;人性化&#xff1a; 而且实景地图的范围也非常大&#xff0c;建立这么大…

Windows系统中不同Java版本共存

Windows系统中不同Java版本共存的方法 在Windows系统中&#xff0c;有时我们需要同时运行多个Java应用&#xff0c;而这些应用可能依赖于不同版本的Java Development Kit (JDK) 或 Java Runtime Environment (JRE)。为了实现这种需求&#xff0c;我们需要在Windows中配置多个J…

自养号测评防关联的关键点解析, 确保店铺权重和买家账号的安全稳定

现在很多大卖都是自己管理几百个账号&#xff0c;交给服务商不是特别靠谱。你不知道服务商账号质量怎么样&#xff0c;账号一天下了多少你也不清楚&#xff0c;如果下了很多单万一封号被关联了怎么办&#xff0c;你也不知道服务商用什么卡给你下单&#xff0c;用一些低汇率和黑…

【Python Cookbook】S02E04 文本模式的匹配和查找 match()、search()、findall() 以及 捕获组和 + 的含义

目录 问题解决方案讨论 问题 本文讨论一些按照特定的文本模式进行的查找和匹配。 解决方案 如果想要匹配的只是简单文字&#xff0c;通常我们使用一些内置的基本字符串方法即可&#xff0c;如&#xff1a;str.find()&#xff0c;str.startwith()&#xff0c;str.endswith() …

qmt量化交易策略小白学习笔记第17期【qmt编程之获取对应周期的北向南向数据--方式1:内置python】

qmt编程之获取对应周期的北向南向数据 qmt更加详细的教程方法&#xff0c;会持续慢慢梳理。 也可找寻博主的历史文章&#xff0c;搜索关键词查看解决方案 &#xff01; 感谢关注&#xff0c;咨询免费开通量化回测与获取实盘权限&#xff0c;欢迎和博主联系&#xff01; 获取…

Qwen2本地部署的实战教程

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

重塑状态管理的艺术:Vue3中Pinia的魔法之旅内包含简易购物车案例

前言 在Vue.js的世界里&#xff0c;每一次更新都是一次进化&#xff0c;Vue3携带着更强大的性能与灵活性翩然而至。而在这场技术盛宴中&#xff0c;Pinia以一种优雅而革命性的方式&#xff0c;重新定义了状态管理的体验。如果说Vuex是Vue2时代的王者&#xff0c;那么Pinia无疑…

024、工具_慢查

1)发送命令 2)命令排队 3)命令执行 4)返回结果 需要注意,慢查询只统计步骤3)的时间,所以没有慢查询并不代表客 户端没有超时问题。 参数配置 slowlog-log-slower-than 单位是微秒(1秒=1000毫秒=1000000微秒),默认值是10000 lowlog-log-slower-than=0会记录所有的命…

Polar Web【简单】upload1

Polar Web【简单】upload1 Contents Polar Web【简单】upload1思路EXP运行&总结 思路 本题思路同之前两篇文中的文件上传题目性质相同&#xff0c;这里再次记录&#xff0c;旨在改良之前的脚本编写方式 —— 脚本运行后变为可交互的命令行形式。 打开环境&#xff0c;见要求…

算法课程笔记——可撤销并查集

算法课程笔记——可撤销并查集 Gv

网络协议三

数据中心 一、DNS 现在网站的数目非常多&#xff0c;常用的网站就有二三十个&#xff0c;如果全部用 IP 地址进行访问&#xff0c;恐怕很难记住 根 DNS 服务器 &#xff1a;返回顶级域 DNS 服务器的 IP 地址 顶级域 DNS 服务器&#xff1a;返回权威 DNS 服务器的 IP 地址 …

k8s:实现一个pod两个容器

# 制作两个容器的镜像 通过以下Dockerfile创建一个镜像 cd /chz/install/docker vim Dockerfile <<<< 内容如下&#xff1a; FROM centosRUN sed -i -e "s|mirrorlist|#mirrorlist|g" /etc/yum.repos.d/CentOS-* RUN sed -i -e "s|#baseurlhttp:/…

vue2的form利用插槽修改错误提示UI

1. 需求 很多时候我们使用el-form想修改下错误提示的UI&#xff0c;比如table中使用form校验这类场景下错误提示的UI调整就非常重要。 2. 了解文档 Form-Item Scoped Slot name说明error自定义表单校验信息的显示方式&#xff0c;参数为 { error } 3.实际使用 html里使用…

全年申报!2024年陕西省双软企业认定条件标准、申报好处费用

1.双软企业是什么? 答:双软认证并不是一个资质,而是"软件产品登记"和"软件企业认定"两个不同资质的统称.叫做"双软企业" 2.双软企业的优惠政策是什么? 答:(1)软件产品登记的优惠政策:软件产品增值税,从13%减按3%征收,实行即征即退; (2)软件…

个人vsCode配置文件<setting.js>

个人vsCode配置文件setting.js 快速打开1、使用快捷键 CtrlShiftP &#xff0c;然后搜索setting2、手动 自用配置 快速打开 1、使用快捷键 CtrlShiftP &#xff0c;然后搜索setting 2、手动 自用配置 {"terminal.integrated.profiles.windows": {"PowerShell&…

用自然语言连接信息孤岛

​​​​​​​ 信息孤岛互联互通的困难 尽管已经进入了互联网时代&#xff0c;信息系统中的信息孤岛现象仍然十分地严重&#xff0c;不同部门&#xff0c;不同机器之间难以实现互联互通。 不同信息系统的相互通信依赖通信协议和数据模型的定义&#xff0c;前者决定了通信的过…

[网络基础]——计算机网络(OSI)参考模型 详解

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f310;网络通信基础TCP/IP专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月2日21点59分 &#x1f004;️文章质量&#xff1a;93分 目录 &#x1f39f;️OSI基本概念 &#x1f384;分层架构…