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

深入理解正则表达式:为什么它在Java中如此重要?

文章目录

  • 一、正则表达式
    • 1.1 为什么引入正则表达式
    • 1.2 什么是正则表达式
  • 二、正则表达式规则
    • 2.1 正则表达式的基本语法规则
    • 2.2 非贪婪匹配
  • 三、正则表达式在java中的应用
    • 3.1 String
    • 3.2 java.util.regex
  • 参考资料

一、正则表达式

1.1 为什么引入正则表达式

在实际编写程序的过程中,我们可能会遇到验证用户输入的数据是否符合特定的格式要求之类的问题:

  • 如何判断字符串是否是有效的电话号码?例如:010-1234567123ABC45613510001000等;
  • 如何判断字符串是否是有效的电子邮件地址?例如:test@example.comtest#example等;
  • 如何判断字符串是否是有效的时间?例如:12:3409:6099:99等。

在未引入正则表达式的前提下,一种直观的想法是通过程序判断,这种方法需要为每种用例创建规则,然后用代码实现。比如,如何判断字符串是否是有效的电话号码的代码:

public static boolean isValidPhoneNumber(String phoneNumber) {// 判断号码长度是否在合理范围内if (phoneNumberWithoutHyphen.length() < 7 || phoneNumberWithoutHyphen.length() > 11) {return false;}// 判断号码中是否有非数字字符for (char c : phoneNumberWithoutHyphen.toCharArray()) {if (!Character.isDigit(c)) {return false;}}// 判断号码中是否有连续的连字符if (phoneNumber.contains("--")) {return false;}return true;
}

事实上,上述代码仅仅做了非常粗略的判断,并未考虑首位数字不能为0等更详细的情况。除了判断手机号,我们还需要判断电子邮件地址、电话、邮编等等。可想而知,为每一种判断逻辑编写代码实在是太繁琐了

为了避免这种情况,我们引入了正则表达式。正则表达式可以用字符串来描述规则,并用来匹配字符串。例如,判断手机号,我们用正则表达式^(\\d{3,4}-?)?\\d{7,8}$

public static boolean isValidPhoneNumber(String phoneNumber) {// 定义电话号码的正则表达式模式String regex = "^(\\d{3,4}-?)?\\d{7,8}$";// 创建Pattern对象Pattern pattern = Pattern.compile(regex);// 创建Matcher对象Matcher matcher = pattern.matcher(phoneNumber);// 使用Matcher的matches方法进行匹配判断return matcher.matches();
}

正则表达式是一套标准,它可以用于任何语言。Java标准库的java.util.regex包内置了正则表达式引擎,在Java程序中使用正则表达式非常简单。

1.2 什么是正则表达式

正则表达式(Regular Expressions,简称正则或Regex)是一种强大的文本匹配和处理工具用于在字符串中查找、匹配和替换特定模式的文本

正则表达式不仅可以在编程时使用,也可以在word、IDE编辑器等软件的搜索和替换窗口中使用

正则表达式的主要目的是为了解决以下问题:

  1. 文本匹配:正则表达式可以帮助我们在一大段文本中快速找到符合特定模式的子串。例如,你可以使用正则表达式来查找所有符合邮箱格式的字符串,或者查找包含特定关键词的句子。
  2. 字符串搜索和查找:当我们需要对包含大量数据的文本进行查找和过滤时,手动实现字符串匹配会很繁琐。使用正则表达式可以通过简单的模式描述来快速地进行查找和过滤。
  3. 数据验证:在开发应用程序时,我们经常需要验证用户输入的数据是否符合特定的格式要求,如邮箱、电话号码、日期等。通过正则表达式,可以轻松进行输入数据的有效性验证。
  4. 替换和格式化:正则表达式不仅可以用于查找,还可以用于将匹配的文本替换为其他内容。这在数据处理和文本编辑时特别有用。
  5. 数据提取:当我们需要从复杂的文本中提取特定信息时,正则表达式可以帮助我们捕获和提取感兴趣的数据。
  6. 批量操作:如果你需要对多个文本文件进行相似的处理,正则表达式可以帮助你一次性完成批量操作,提高效率。

二、正则表达式规则

2.1 正则表达式的基本语法规则

正则表达式的语法规则如下:

  1. 字面字符:大多数字符只表示它们自己,例如字母、数字和常见的标点符号。
  2. 特殊字符:具有特殊含义的字符,需要使用转义字符 \ 来表示字面含义。常见的特殊字符包括:. ^ $ * + ? { } [ ] \ | ( )
  3. 字符类:用方括号 [] 表示一个字符类,表示在此位置可以匹配方括号中的任意字符。例如,[abc] 表示可以匹配字符 abc
  4. 范围表示:在字符类内使用连字符 -,可以表示一个字符范围。例如,[0-9] 表示可以匹配任意数字。
  5. 排除字符类:在字符类内使用脱字符 ^,可以表示排除的字符类。例如,[^0-9] 表示可以匹配任意非数字字符。
  6. 预定义字符类:用反斜杠 \ 加上一个预定义字符表示一些常见的字符类。例如,\d 表示任意数字,\w 表示任意字母、数字和下划线。
  7. 量词:用于指定前面的字符或子表达式出现的次数。常见的量词包括:*(零次或多次),+(一次或多次),?(零次或一次),{n}(恰好 n 次),{n,}(至少 n 次),{n,m}(至少 n 次,至多 m 次)。
  8. 分组:用小括号 () 表示一个子表达式,将一组字符视为一个整体,并可以应用量词或其他操作符。例如,(abc)+ 表示连续出现一次或多次的字符串 “abc”。
  9. 选择符:用竖线 | 表示多个子表达式之间的选择,匹配其中任意一个。例如,abc|def 表示匹配 “abc” 或 “def”。
  10. 边界匹配:用 ^ 表示字符串的开始,用 $ 表示字符串的结尾。例如,^abc 表示匹配以 “abc” 开始的字符串。

以上是正则表达式的基本语法规则。正则表达式提供了丰富的功能,可以根据不同的需求进行组合和扩展。然而,由于正则表达式的语法较为复杂和灵活,对于复杂的模式描述,可能需要一定的学习和练习才能熟练运用。

2.2 非贪婪匹配

正则表达式匹配默认使用贪婪匹配,可以使用?表示对某一规则进行非贪婪匹配。

具体详情可以参考非贪婪匹配 - 廖雪峰的官方网站 (liaoxuefeng.com)

三、正则表达式在java中的应用

3.1 String

在Java中,String.matches() 方法要求整个字符串与正则表达式完全匹配。示例代码如下:

public class StringMatchesExample {public static void main(String[] args) {String regex = "[A-Za-z]+\\d+"; // 匹配至少一个字母后面跟着至少一个数字的模式String str1 = "Ab123"; // 符合正则表达式String str2 = "HelloWorld"; // 不符合正则表达式String str3 = "12345"; // 不符合正则表达式System.out.println("str1 matches regex: " + str1.matches(regex));System.out.println("str2 matches regex: " + str2.matches(regex));System.out.println("str3 matches regex: " + str3.matches(regex));}
}

需要注意的是:正则表达式在Java代码中也是一个字符串,所以,对于正则表达式a\&c来说,对应的Java字符串是"a\\&c",因为\也是Java字符串的转义字符,两个\\实际上表示的是一个\

如果你想要在字符串中查找是否包含符合正则表达式的部分,你可以使用 Pattern 类和 Matcher 类来实现更灵活的匹配操作。事实上,String.matches()方法内部调用的就是PatternMatcher类的方法。

3.2 java.util.regex

java.util.regex 中,Pattern 类和 Matcher 类是用于处理正则表达式的两个关键类。Pattern 类用于编译和表示正则表达式,而 Matcher 类则用于在文本中执行匹配操作。下面是一个简单的示例代码,演示如何使用 PatternMatcher 类进行匹配:

import java.util.regex.*;public class PatternMatcherExample {public static void main(String[] args) {String regex = "\\b\\d{3}-\\d{4}\\b"; // 匹配形如 xxx-xxxx 的电话号码模式String text = "这是我的电话号码:123-4567,你的电话号码是:987-6543。";// 创建 Pattern 对象Pattern pattern = Pattern.compile(regex);// 创建 Matcher 对象Matcher matcher = pattern.matcher(text);// 查找匹配的电话号码while (matcher.find()) {System.out.println("找到匹配的电话号码:" + matcher.group());}}
}

输出结果为:

找到匹配的电话号码:123-4567
找到匹配的电话号码:987-6543

在上面的示例中,我们使用正则表达式 \\b\\d{3}-\\d{4}\\b,该正则表达式用于匹配形如 xxx-xxxx 的电话号码模式。其中,\\b 表示单词边界,确保电话号码前后不会与其他字符连在一起;\\d{3} 表示匹配 3 个数字,- 表示匹配一个连字符,\\d{4} 表示匹配 4 个数字。

接着,我们创建了 Pattern 对象并编译正则表达式。然后,使用 Matcher 对象来在文本中执行匹配操作,matcher.find() 方法用于查找匹配的子串。如果找到匹配的电话号码,我们通过 matcher.group() 方法来获取匹配的子串,并输出它们。

matcher.group() 方法也可以和分组匹配结合在一起使用。

参考资料

正则表达式简介 - 廖雪峰的官方网站 (liaoxuefeng.com)
使用正则表达式 - Visual Studio (Windows) | Microsoft Learn

相关文章:

深入理解正则表达式:为什么它在Java中如此重要?

文章目录 一、正则表达式1.1 为什么引入正则表达式1.2 什么是正则表达式 二、正则表达式规则2.1 正则表达式的基本语法规则2.2 非贪婪匹配 三、正则表达式在java中的应用3.1 String3.2 java.util.regex 参考资料 一、正则表达式 1.1 为什么引入正则表达式 在实际编写程序的过…...

jmeter实现webservice接口测试

其实可以用jmeter两种sampler进行webservice的测试&#xff1a; 1、SOAP/XML-RPC Request(但是在jmeter3.2以后版本中已经取消了这个取样器) 2、HTTP请求 下面分别介绍两种方式 一、首先需要使用soupUI工具抓取webservice接口的部分需要的信息。 1、新建项目 2、新建成功的…...

js 四舍五入保留一位小数 求百分比

概览&#xff1a;一个数据占一组数据的比率&#xff0c;并且四舍五入保留一位小数。通过Math.round()四舍五入。 参考链接&#xff1a; mdn中文文档Math.round() 实现思路&#xff1a; Math.round(x) 函数返回一个数字四舍五入后最接近的整数。参数x是一个数值 实现代码&a…...

文件上传漏洞总结2

文件上传的大体都已经学习过了 这个假期在给他强化一下 什么是webshell webshell是web入侵的脚本攻击工具。webshell就是一个asp或php木马后门&#xff0c;黑客在入侵了一个网站后&#xff0c;常常在将这些asp或php木马后门文件放置在网站服务器的web目录中&#xff0c;与正常…...

【组内工作】木马回联

文章目录 C2服务器安装和运行方法CrossC2运行方法sliver运行方法empire安装方法DeimosC2安装教程TrevorC2安装教程&#xff1a; C2服务器的流量特征CrossC21. 心跳包2. 命令3. ja3/ja3s Sliver1. http2. https empirehttphttps DeimosC2https TrevorC2 C2服务器安装和运行方法 …...

未来将会有更多基于 Cortana 的设备

在前些日子的 Build 大会首日 Keynote 中&#xff0c;微软正式确认 HP 跟 Intel 也正在开发基于 Cortana 平台的联网家居产品&#xff0c;这是继推出 Invoke 喇叭的 Harman Kardon 后&#xff0c;又有知名大牌加入到 Cortana 的阵营当中&#xff0c;有这样的品牌资源背景&#…...

嵌入式硬件系统的基本组成

嵌入式硬件系统的基本组成 嵌入式系统的硬件是以包含嵌入式微处理器的SOC为核心&#xff0c;主要由SOC、总线、存储器、输入/输出接口和设备组成。 嵌入式微处理器 每个嵌入式系统至少包含一个嵌入式微处理器 嵌入式微处理器体系结构可采用冯.诺依曼&#xff08;Von Neumann&…...

def __init__(self, **kwargs):中的**kwargs是什么意思

**kwargs是什么意思 在Python中&#xff0c;**kwargs是一种特殊的参数形式&#xff0c;用于接收可变数量的关键字参数&#xff08;Keyword Arguments&#xff09;。kwargs是一个字典&#xff08;dictionary&#xff09;&#xff0c;其中关键字是参数名&#xff0c;对应的值是传…...

web攻击面试|网络渗透面试(三)

Web攻击大纲 常见Web攻击类型&#xff1a; SQL注入攻击&#xff1a;介绍SQL注入攻击的概念、原理和常见的攻击方式&#xff0c;如基于错误消息的注入、基于布尔盲注的注入等。解释攻击者如何利用SQL注入漏洞获取敏感信息或者对数据库进行恶意操作&#xff0c;并提供防御措施&a…...

数据分析方法

常用的数据分析方法有&#xff1a;1、对比分析法&#xff1b;2、分组分析法&#xff1b;3、结构分析法&#xff1b;4、留存分析法&#xff1b;5、交叉分析法&#xff1b;6、漏斗分析法&#xff1b;7、矩阵分析法&#xff1b;8、象限分析法&#xff1b;9、趋势分析法&#xff1b…...

Spring全家桶---白虎篇

其中包括&#xff1a;Spring、Spring6、Spring Data、Spring Cloud Alibaba、Spring Cloud、Spring Boot、Spring Security、SpringMVC。 &#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是小童&#xff0c;Java开发工程师&#xff0c;CSDN博客博主&#xff0c;Java领域…...

深度优先搜索|79, 695,212

深度优先搜索|79. 单词搜索, 695. 岛屿的最大面积, 212. 单词搜索 II 单词搜索岛屿的最大面积单词搜索II 单词搜索 用的是深度优先搜索&#xff0c;这种判断类型的回溯我就一直不知道要怎么回退&#xff0c;然后勉强写了一个。 这里还有一个注意事项就是&#xff0c;走到最后一…...

论文阅读与管理方法论

文章目录 为什么读论文论文类型综述论文专题论文 论文质量角度关于如何找论文的小Tips如何整理论文读论文的困境如何读论文不同人群阅读差异读论文三部曲&#xff1a;泛读、精读、总结泛读&#xff1a;快速浏览&#xff0c;把握概要。泛读目标及效果自测 精读&#xff1a;选出精…...

基于OAI与Ueransim的5G网络切片平台构成简述

自定义多切片核心网构建 为了实现在同一台机器上同时对每一个切片启动一套单独的核心网&#xff0c;并且可以同时启动多套核心网&#xff0c;我们在官方提供的核心网模板的基础上进行适当的修改&#xff0c;扩展出其他可以正常运行的核心网&#xff0c;由此我们可以实现在同一…...

论文笔记:Adjusting for Autocorrelated Errors in Neural Networks for Time Series

2021 NIPS 原来的时间序列预测任务是根据预测论文提出用一阶自回归误差预测 一阶差分&#xff0c;类似于ResNet的残差思路&#xff1f;记为pred&#xff0c;最终的预测结果...

DataEase开源BI工具安装_数据全量_增量同步_大屏拖拽自动生成_多数据源支持_数据血缘分析---大数据工作笔记0183

我这里用的是Centos7.9安装的 可以通过uname -p来查看一下我们的电脑架构,可以看到是x86_64架构的 我们下第一个,这个是x86架构的,第二个arm架构的 然后解压到/opt/module中 然后再去重命名一下文件夹. 推荐200G 本地模式的功能比较多 推荐100G...

如何提升程序员的软素质

目录 软素质包含哪些方面怎么做总结 软素质包含哪些方面 在项目研发迭代的过程中&#xff0c;确保一次上线顺利不难&#xff0c;难得是每次上线都顺利。对一个人或团队&#xff0c;只要有一次上线有问题&#xff0c;那在领导看来&#xff0c;你这个人或团队的工作是不靠谱的。…...

msvcp100.dll丢失怎么修复,这三个常用的修复方法可以解决

msvcp100.dll是一个动态链接库文件&#xff0c;它是Microsoft Visual C Redistributable软件包的一部分。这个文件的作用是提供在运行C程序时所需的函数和功能。msvcp100.dll是一个非常重要的文件&#xff0c;它为我们提供了许多关键的函数和类&#xff0c;使得我们能够更高效地…...

python实现递推算法解决分鱼问题

一、问题描述 A、B、C、D、E5个人合伙夜间捕鱼&#xff0c;凌晨时都已经疲惫不堪&#xff0c;于是各自在河边的树丛中找地方睡着了。第二天日上三竿时&#xff0c;A第一个醒来&#xff0c;他将鱼平分为5份&#xff0c;把多余的一条扔回河中&#xff0c;然后拿着自己的一份回家…...

【LeetCode】142.环形链表Ⅱ

题目 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部…...

16.Netty源码之ChannelPipeline

highlight: arduino-light 服务编排层:ChannelPipeline协调ChannelHandlerHandler EventLoop可以说是 Netty 的调度中心&#xff0c;负责监听多种事件类型&#xff1a;I/O 事件、信号事件、定时事件等&#xff0c;然而实际的业务处理逻辑则是由 ChannelPipeline 中所定义的 Cha…...

“使用Spring Boot构建微服务应用的最佳实践“

标题&#xff1a;使用Spring Boot构建微服务应用的最佳实践 摘要&#xff1a;本文将介绍如何使用Spring Boot构建微服务应用的最佳实践。我们将讨论微服务架构的概念、Spring Boot的优势以及一些最佳实践&#xff0c;同时提供示例代码帮助读者更好地理解和实践。 正文&#x…...

redis高可用之主从复制,哨兵,集群

目录 前言 一、主从复制 1、主从复制的作用 2、主从复制流程 3、部署Redis 主从复制步骤 3.1 环境准备 3.3 修改Redis 配置文件(Master节点操作) 3.4 修改Redis 配置文件(Slave节点操作) 3.5 验证主从效果 二、哨兵 1、哨兵模式原理 2、哨兵模式…...

【Ajax】笔记-原生jsonp跨域请求案例

原生jsonp跨域请求 输入框&#xff1a;输入后&#xff0c;鼠标移开向服务端发送请求&#xff0c;返回用户不存在(直接返回不存在&#xff0c;不做判断) JS <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><me…...

QT--day2(信号与槽,多界面跳转)

第一个界面头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QIcon> //图标头文件 #include <QPushButton> //按钮类头文件QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public…...

热备份路由协议原理

热备份路由协议原理 HSRP协议/VRRP协议热备份协议 热备份协议&#xff08;Hot Standby Protocol&#xff09; 是一种基于冗余设计的协议&#xff0c;用于提高网络的可靠性和冗余性。它允许多个设备共享同一个IP地址&#xff0c;其中一个设备被选为主设备&#xff0c;其他设备…...

模拟实现定时器

关于java标准库中的定时器的使用可以看定时器Timer的使用 大致思路 定义一个MyTimeTask类&#xff0c;该类用于组织要执行任务的内容以及执行任务的时间戳&#xff0c;后面要根据当前系统时间以及执行任务的时间戳进行比较&#xff0c;来判断是否要执行任务或是要等待任务 用一…...

TCP/IP的分包粘包

TCP/IP的分包粘包 分包粘包介绍导致分包粘包的原因导致TCP粘包的原因&#xff1a;导致TCP分包的原因&#xff1a;避免分包粘包的措施 分包粘包介绍 因为TCP为了减少额外开销&#xff0c;采取的是流式传输&#xff0c;所以接收端在一次接收的时候有可能一次接收多个包。而TCP粘…...

盘点:查快递教程

在“寄快递”成为常态的当下&#xff0c;如何快速进行物流信息查询&#xff0c;是收寄人所关心的问题。在回答这个问题之前&#xff0c;首先我们要知道&#xff0c;物流信息查询&#xff0c;有哪些方法&#xff1f; 1、官网单号查询 知道物流公司和单号的情况下&#xff0c;直…...

TransGPT 开源交通大模型开源

TransGPT 是开源交通大模型&#xff0c;主要致力于在真实交通行业中发挥实际价值。 它能够实现交通情况预测、智能咨询助手、公共交通服务、交通规划设计、交通安全教育、协助管理、交通事故报告和分析、自动驾驶辅助系统等功能。 TransGPT 作为一个通用常识交通大模型&#…...

网站建设的软件有哪些/免费刷粉网站推广免费

伯克利人工智能实验室博客&#xff1a;http://bair.berkeley.edu/blog/ 下雨天&#xff1a; 有些人能听见下雨的声音&#xff0c;有些事只是在奔跑中淋湿&#xff01; We are all in the gutter, but some of us are looking at the stars.Oscar Wilde我们都生活在阴沟里&#…...

网站建设需求书模板/迅雷磁力链bt磁力天堂

目标网站&#xff1a;http://bohaishibei.com/post/category/main/&#xff08;一个很有趣的网站&#xff0c;一段话配一个图&#xff0c;老有意思了&#xff5e;&#xff09;网站形式如下&#xff1a; 爬取标题和图片链接 ​ import re import requests url"https://bh.…...

福建自己建设网站/上海最新新闻事件今天国内

Atitit.软件与编程语言中的锁机制原理attilax总结 1. 用途 &#xff08;Db&#xff0c;业务数据加锁&#xff0c;并发操作加锁。1 2. 锁得类型 排它锁 “互斥锁 共享锁 乐观锁与悲观锁1 2.1. 自旋锁还是信号量1 2.2. -自动释放还是手动释放1 3. 实现方式&#xff0c;语言方式与…...

温州市营销网站建设/推广普通话手抄报内容怎么写

我们想要用Python获得一些有关系统的各种信息的时候就不得不想到os的environ&#xff0c;那这里面都具体包含了那些内容呢&#xff1f; 简介 对于官方的解释&#xff0c;environ是一个字符串所对应环境的映像对象。这是什么意思呢&#xff1f;举个例子来说&#xff0c;environ[…...

免费做mc皮肤网站/营销型企业网站有哪些

Java集合类1—简介及其层次关系 在Java中有一个集合框架&#xff0c;用来表示一个操作集合。在Java 2平台中实现了一个新的集合框架&#xff0c;但是在先前的集合框架依然可以使用。这里的结合框架就是我们所说的集合类。一个集合是一种对象它表示了一组对象。集合框架主要是由…...

汽车精品设计网站建设/电商怎么做推广

《C语言程序设计》是以实现一个完整的企业项目——学生成绩管理系统为载体展开的&#xff0c;主要实现录入、查询、统计、管理和保存等功能。《C语言程序设计》主要内容包括C语言程序设计概述、C语言编程元素、选择程序设计、循环程序设计、数组程序设计、指针程序设计、函数程…...