如何掌握 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.mzph.cn/web/23613.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络协议三

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

汇凯金业:贵金属交易规则有哪些

贵金属投资目前非常火热&#xff0c;许多投资者从中获得了可观的收益。新手投资者在进入贵金属市场及其交易之前&#xff0c;务必要了解清楚贵金属的交易规则。了解规则和差异能帮助新手更好地进行贵金属投资交易。下面我们以现货类贵金属为例&#xff0c;详细说明贵金属的交易…

一周学会Django5 Python Web开发 - Django5内置Auth认证系统-用户修改密码实现

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计59条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

基于springboot的-仓库 管理系统【附:资料➕文档】

前言&#xff1a;我是源码分享交流Coding&#xff0c;专注JavaVue领域&#xff0c;专业提供程序设计开发、源码分享、 技术指导讲解、各类项目免费分享&#xff0c;定制和毕业设计服务&#xff01; 免费获取方式--->>文章末尾处&#xff01; 项目介绍&#xff1a; 管理员…

数字IC后端物理验证PV | TSMC 12nm Calibre Base Layer DRC案例解析

基于TSMC 12nm ARM A55 upf flow后端设计实现训练营将于6月中旬正式开班&#xff01;小班教学&#xff01;目前还有3个名额&#xff0c;招满为止&#xff01;有需要可以私信小编 ic-backend2018报名。吾爱IC社区所有训练营课程均为直播课&#xff01; 这个课程支持升级成双核A…

服务器禁止密码登陆

转载请标明出处&#xff1a;https://blog.csdn.net/donkor_/article/details/139444224 文章目录 一、前言二、编辑sshd_config文件三、重启服务四、总结 一、前言 复杂的密码&#xff0c;登陆服务器的时候&#xff0c;也是很不方便的。并且频繁登陆&#xff0c;暴露给外界&am…

c++ 里函数选择的优先级:普通函数、模板函数、万能引用,编译器选择哪个执行呢?

看大师写的代码时&#xff0c;除了在类里定义了 copy 构造函数&#xff0c;移动构造函数&#xff0c;还定义了对形参采取万能引用的构造函数&#xff0c;因此有个疑问&#xff0c;这时候的构造函数优先级是什么样的呢&#xff1f;简化逻辑测试一下&#xff0c;如下图&#xff0…

【Vue】路由的封装抽离

问题&#xff1a;所有的路由配置都在main.js中合适吗&#xff1f; 目标&#xff1a;将路由模块抽离出来。 好处&#xff1a;拆分模块&#xff0c;利于维护 路径简写&#xff1a; 脚手架环境下 指代src目录&#xff0c;可以用于快速引入组件 完整代码 router/index.js // 但…

探索贷款交易平台的技术架构与创新应用

随着金融科技的快速发展&#xff0c;贷款交易平台作为金融行业的重要组成部分&#xff0c;正扮演着越来越重要的角色。本文将深入探讨贷款交易平台的技术架构和创新应用&#xff0c;从前端设计、后端系统、安全保障和智能化服务等方面进行全面解析&#xff0c;帮助读者更好地了…

【Python报错】已解决AttributeError: list object has no attribute ’shape‘ ( Solved )

解决Python报错&#xff1a;AttributeError: ‘list’ object has no attribute ‘shape’ (Solved) 在Python中&#xff0c;AttributeError表明你试图访问的对象没有你请求的属性或方法。如果你遇到了AttributeError: list object has no attribute shape的错误&#xff0c;这…

为什么要用Git

1. Git是什么 1.1. 概述 Git是分布式版本控制系统&#xff0c;与SVN类似的集中化版本控制系统相比&#xff0c;集中化版本控制系统如果中央服务器宕机则会影响数据和协同开发。 Git是分布式的版本控制系统&#xff0c;客户端不只是提取最新版本的快照&#xff0c;而且将整个…

【Java毕业设计】基于Java的特色美食推荐网站的设计与实现

文章目录 摘 要ABSTRACT目 录1 概述1.1 研究背景及意义1.2 国内外研究现状1.3 拟研究内容1.4 系统开发技术1.4.1 Java编程语言1.4.2 SpringBoot框架1.4.3 MySQL数据库1.4.4 B/S结构1.4.5 MVC模式 2 系统需求分析2.1 可行性分析2.2 任务概述2.3 功能性需求3.2.2 数据库逻辑结构设…

外汇天眼:FSCS确认TenetConnect Services Ltd已任命管理人

2024年6月5日&#xff0c;Tenet Group Ltd的董事们任命了Interpath Ltd的Ed Boyle、Howard Smith和Rob Spence为联合管理人。Ed Boyle和Rob Spence也被任命为其子公司Tenet Ltd、TenetConnect Ltd和TenetConnect Services Ltd的联合管理人。Tenet Mortgage Services Ltd和Tenet…

【计算机视觉(8)】

基于Python的OpenCV基础入门——图像直方图 直方图图像直方图 图像直方图代码以及实现效果 直方图 直方图是一种用于描述图像亮度分布的统计工具。它将图像的像素亮度值按照不同的亮度等级进行计数&#xff0c;并以直方图的形式呈现出来。图像直方图可以显示图像中每个亮度级别…

点击式的excel电子表格查找修改功能,比xlookup和vlookup简单,多列关联查询速度更快

经过实际测试&#xff0c;excel的xlookup确实非常简单&#xff0c;有部分功能也非常快。但是有的人不会公式&#xff0c;或者不喜欢用公式&#xff0c;或者没有excel2021以上的版本。而且xlookup确实也有些还不是很完美的地方&#xff0c;比如对多列关联查询很慢。所以我们还是…

selenium非全新的方式同时启动多个浏览器又互不影响的一种实现方法,欢迎讨论!

最近在做模拟浏览器批量定时自动点击实现批量操作功能&#xff0c;主要使用selenium&#xff0c;但是发现selenium直接调用本地浏览器&#xff0c;启动的是一个全新的&#xff08;与手动打开的不一致&#xff09;&#xff0c;网站可以检测到&#xff0c;每次都要双重验证(密码登…

Windows系统中不同Java版本共存

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

电商APP用户体验提升技巧:一个实战案例

随着网络和移动技术的快速发展&#xff0c;加上全球疫情的影响&#xff0c;电子商务应用程序改变了人们的购物方式&#xff0c;积累了大量的用户群体。如今&#xff0c;一个成功的电子商务应用程序&#xff0c;除了网站用户界面的美&#xff0c;电子商务用户体验的设计&#xf…

深度学习笔记: 最详尽LinkedIn Feed 排名系统设计

欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家&#xff01; LinkedIn Feed 排名 1. 问题陈述 设计一个个性化的LinkedIn Feed&#xff0c;以最大化用户的长期参与度…

Typecho:简约而强大的开源PHP博客平台

Typecho&#xff1a;让博客写作回归本质- 精选真开源&#xff0c;释放新价值。 概览 Typecho是一个开源的PHP博客平台&#xff0c;以其简洁的界面和强大的功能&#xff0c;为博客作者提供了一个高效、易于管理的写作环境。它是一个轻量级、高性能的解决方案&#xff0c;适用于…