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

正则表达式在Java中的使用 文章目录介绍从简单例子认识正则表达式匹配Java中对正则表达式的支持(各种语言有相应的实现)初步认识 . + * ?范围认识\s \w \d \关于`\`边界处理练习:匹配空白行合email地址Matcher类的`matches()`,`find()`和`lookingAt()`Matcher类中的`start()`和`end()`替换字符串升级: 不区分大小写查找并替换字符串再升级: 不区分大小... 阅读详情

一、正则表达式

1.1 为什么引入正则表达式

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

  • 如何判断字符串是否是有效的电话号码?例如:010-1234567,123ABC456,13510001000等;
  • 如何判断字符串是否是有效的电子邮件地址?例如:test@example.com,test#example等;
  • 如何判断字符串是否是有效的时间?例如:12:34,09:60,99: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] 表示可以匹配字符 a、b 或 c。
  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()方法内部调用的就是Pattern和Matcher类的方法。

3.2 java.util.regex

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

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

算法之深入理解正则表达式与非确定有限状态自动机 在算法的学习过程中,我常常被各种精妙的思想和复杂的概念所吸引,同时也深知独自探索的艰辛。正则表达式和与之紧密相关的非确定有限状态自动机(NFA)就是这样既有趣又具有挑战性的知识领域。今天,我想把自己在学习这些知识时的收获分享给大家,希望我们能一起进步,更深入地理解它们的原理和应用。 阅读详情

相关推荐

MinerU与Docling:智能文档处理框架对比

本文对比分析了MinerU和Docling两大智能文档处理框架。MinerU专注于高精度PDF解析,采用多模态AI技术,在学术文献、金融报表等复杂文档处理上表现优异;Docling则定位企业级多格式文档处理平台,支持10+格式转换,更适合文档管理系统等场景。技术层面,MinerU基于VLM模型实现端到端处理,Docling采用插件化多后端架构。性能测试显示MinerU精度更高(95%+),但资源消耗较大;Docling处理速度更快(1-3秒/页),部署更灵活。

轩哥的个人研究和成长记录 1898

Java实现正则表达式

参考博客:https://blog.csdn.net/hello_cmy/article/details/96473213 正则表达式 (1)就是符合一定规则的字符串 (2)常见规则 A:字符 x 字符 x。举例:‘a’表示字符a \ 反斜线字符。 \n 新行(换行)符 (’\u000A’) \r 回车符 (’\u000D’) B:字符类 [abc] a、b 或 c(简单类) [^abc] 任何字符,除了 a、b 或 c(否定) [a-zA-Z] a到 z 或 A到 Z,两头的字

L_ancelot_的博客 571

Win11 C盘爆满别慌!手把手教你安全迁移AppData和用户文件夹(附一键脚本)

本文针对Win11 C盘空间不足问题,提供了一套安全有效的解决方案。通过深入解析用户目录结构,指导用户利用符号链接和Robocopy工具,将AppData、下载文档等占用大户迁移至其他分区,并附带了自动化脚本,从根本上实现C盘瘦身,同时确保系统稳定和数据安全。

weixin_29231221的博客 2069

正则表达式的使用(超详细)适用于任何语言java、python等等

正则表达式是很多应用场景都能使用到的语法,我们需要对数据进行分析的人对正则表达式的需求很高,所以我们得好好掌握,以便我们对数据进行分析,本教程适用于java、python、c/c++、PHP、Go、JS、C#等语言的正则表达式,大家都可以进行学习,本教程不进行更多语言拓展,仅对正则表达式进行讲解,后续会进行更深入的更新!我们进行了限定符、分组、或运算符、字符类、元字符、贪婪与懒惰匹配,两个实例的讲解

m0_54722399的博客 4460

IP白名单校验

支持格式: 1、127.0.0.1 // 指定固定IP 2、127.0.0.1-127.0.0.128 // 可使用“-”来表示一个IP区间,支持跨IP段(一般不会出现这种情况,跨IP段则配置多个规则) 3、127.0.* // 2~4位IP段可...

2196

PyTorch多机训练Loss不一致问题排查指南:基于算子级一致性验证

比较二次训练过程中所有算子的误差,定位存在一致性问题的pytorch算子

Hi20240217的博客 1150

【从菜鸟到高手】 正则表达式

1 正则表达式 形而上者谓之道,形而下者谓之器!在学习和使用正则表达式时,知其然,知其所以然,不然的话,理解的不深刻,就会学着累,用着烦! 首先,正则表达式很重要! 字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求无处不在。通过正则表达式可以精确匹配特定模式的字符串,进而更好的完成字符串操作,比如模式校验、检索、替换等等。 所以,程序员必须熟练使用正则表达式! 其次,正则表达式是一...

抱朴守拙 5466

使用 Wireshark 进行计算机网络协议分析

文章目录实验前准备一、Wireshark抓包示例二、Wireshark实作1、数据链路层实作一 熟悉Ethernet帧结构实作二 了解子网内/外通信时的 MAC 地址实作三 掌握 ARP 解析过程2、网络层实作一 熟悉 IP 包结构实作二 IP 包的分段与重组实作三 考察 TTL 事件3、传输层实作一 熟悉 TCP 和 UDP 段结构实作二 分析 TCP 建立和释放连接4、应用层实作一 了解 DNS 解析实作二 了解 HTTP 的请求和应答 实验前准备 本部分实验用到的是抓包和协议分析软件——Wiresha

weixin_51087836的博客 8195

python一定要学正则表达式么_Python 正则表达 有没有一定的必要去记呀?

针对你的问题,简单回答如下:正则用途很广很多(详见后),是程序员的强力工具箱,广泛用于前后端对字段合法性的校验,以及爬虫筛选并规整数据。至于Python正则表达式,只要懂基本的compile,search,match, findall,剩下的要用再查[文档](https://docs.python.org/3.6/library/re.html)。当然,练得纯熟也好。你一定要会正则表达式,因为它...

weixin_39713814的博客 555

RAD Studio 10.4.2 安装避坑指南:从镜像加载到首次运行的全流程解析

本文提供了一份详尽的RAD Studio 10.4.2安装避坑指南,涵盖从镜像验证、文件提取到安装激活的全流程。重点解析了安装教程中常见的权限、路径及激活顺序等关键“坑点”,旨在帮助开发者,尤其是Delphi和C++Builder新手,一次性顺利完成安装与配置,确保开发环境稳定运行。

weixin_29224309的博客 321

告别编译报错!STC32G12K128在Keil C251下的完整Target配置指南(附ROM设置详解)

本文详细介绍了STC32G12K128在Keil C251下的完整Target配置指南,包括ROM设置、CPU模式选择、内存模型优化等关键步骤。通过实战技巧和常见错误解决方案,帮助开发者高效搭建编译环境,避免常见报错,充分发挥STC32G系列芯片的性能优势。

weixin_29186249的博客 335

正则表达式在Java中的运用

正则表达式在Java中的运用正则表达式基础知识定义及作用语法限定符定位符元字符运算符优先级补充Java中的运用相关正则的类常用方法Pattern 类Matcher 类PatternSyntaxException 类 正则表达式基础知识 定义及作用 正则表达式定义了字符串的模式。正则表达式可以用来搜索、编辑或处理文本。 语法 限定符 字符 描述 * 匹配前面的子表达式零次或多次。例如...

NestorBian的博客 409

华为OD技术面八股文_C++_02

汇总华为OD面试C++方面计数八股文真题,提供详细解答。

qq_45776114的博客 754

Java 正则表达式匹配

Java 正则表达式匹配

吴名氏的博客 13万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

深入理解Java正则表达式

概述 Java 正则表达式 正则表达式定义了字符串的模式。 正则表达式可以用来搜索、编辑或处理文本。 正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。 深入理解Java正则表达式:(为了能看清,本文正则表达式用中文的句号代替英文句点) 英文句点符号:匹配单个任意字符。 eg: 表达式”t。o 可以匹配:tno,t#o,teo等等。不可以匹配:tnno,to,Tno,t...

zhuguang10的博客 442

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java正则完美匹配注释,深入理解正则表达式

原标题:深入理解正则表达式一 前言对于正则表达式,相信很多人都知道,但是很多人的第一感觉就是难学,因为看第一眼时,觉得完全没有规律可寻,而且全是一堆各种各样的特殊符号,完全不知所云。其实只是对正则不了解而以,了解了你就会发现,原来就这样啊正则所用的相关字符其实不多,也不难记,更不难懂,唯一难的就是组合起来之后,可读性比较差,而且不容易理解,本文旨在让大家对正则有一个基本的了解,能看得懂简单的正则表...

weixin_36301639的博客 1064

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

深入理解正则表达式及基本使用教程

正则表达式(Regular Expression,简称 Regex)是一种文本处理的利器,它广泛应用于验证、搜索、提取和替换文本的场景中。在 Java 中,正则表达式被包很好地支持,提供了强大的匹配能力。本文将带你从零学习正则表达式,涵盖基本语法、实际应用场景以及详细的 Java 代码示例,帮助你掌握这项极为实用的技能。一、正则表达式是什么?正则表达式是一种用于描述文本模式的语言。验证:检查字符串是否符合特定规则(如邮箱格式、手机号验证)。提取:从复杂的文本中提取有用信息(如时间、日期、IP 地址)。

技术分享 1836

java正则 pp_java正则表达式彻底研究

java正则表达式彻底研究更新时间:2008年08月03日 16:15:10 作者:从J2SE1.4起Java增加了对正则表达式的支持就是java.util.regex包packagetestreg;importjava.util.regex.Matcher;importjava.util.regex.Pattern;/***Title:正则表达式的研究*Description:*...

weixin_39805644的博客 2135

深入理解正则表达式

正则表达式 正则表达式,是字符串匹配模式,匹配到符合正则规则的字符串。 用编程思想来解释它: 输入:若干长度的字符串 过程:正则表达式处理 输出:符合正则表达式的子串 用官方的解释来解释它如下: 正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。 ...

z_ssyy的博客 656

深入理解Java正则表达式及其应用

正则表达式是一种强大的文本匹配和处理工具,可以在字符串中查找、替换、提取符合特定模式的内容。在Java中,我们可以使用Pattern类的compile()方法将正则表达式编译为一个Pattern对象,并使用Matcher类的方法进行匹配操作,如matches()、find()、group()等。通过正则表达式,我们可以在字符串中查找特定的模式并进行替换,或从字符串中提取出需要的信息。通过匹配日志文件中的特定模式,我们可以统计日志中的错误信息、访问次数等,或从网页中抽取出需要的数据。

JudyEdith的博客 821

Java正则表达式教程

Java通过java.util.regex包全面支持正则表达式功能。 正则表达式语言易于学习,但很难掌握,更好的学习方法是通过示例。 从理论上讲,正则表达式几乎可以匹配您想要的任何东西,唯一的限制是您的想像力。 快乐学习Java正则表达式???? 用户名正则表达式 Java中的用户名正则表达式示例,并使用TestNG进行了单元测试。 ^[a-z0-9_-]{3,15}$ 密码正...

一名可爱的技术搬运工 251

Java学习之正则表达式篇

正则表达式学习

MeiMing_104的博客 644

java正则表达式

一、概念 正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。在众多语言中都可以支持正则表达式,如Perl、PHP、Java、Python、Ruby等。当然在Java中也可以通过处理字符串的方式达到检索,替换文本字符串的目的,但是有了正则表达式写代码更加简洁,通常两三行代码就可以达到目的,当然这也是建立在熟悉正则表达式的基础之上的。 二、正则表达式的规则

weixin_51022898的博客 150

深入理解Java中的转义字符

深入分析了一下Java字符串和正则表达式中的反斜杠和转义字符的用法

码农无双的博客 2277

java常用正则表达式,深入理解kotlin协程pdf

*/ public static final String INTEGER_POSITIVE = “^-[1-9]\d*|0$”; /** Double正则表达式 ^-?([1-9]\d*.\d*|0.\d*[1-9]\d*|0?.0+|0)$ */ public static final String DOUBLE ="^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$"; /** 正Double正则表达式 >=0 1\d*.\d*|0.\d*[1-9

m0_66264819的博客 175

java 正则表达式匹配字符串开头

给大家整理了一些有关【表达式,字符串,Java】的项目学习资料(附讲解~~):https://edu.51cto.com/course/35079.htmlhttps://edu.51cto.com/course/35714.html以一些关于【正则表达式】的学习资料和大家一起分享一下:https://edu.51c...

weixin_42355387的博客 556
上一篇: 深入理解设计模式:设计模式定义、设计原则以及组织编目
下一篇: Word软件手动安装Zotero插件
idealzouhu
博客等级 码龄8年 1828粉丝 134原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值