正则表达式解析与应用:深度剖析正则表达式的威力

2024-01-05 21:12

本文主要是介绍正则表达式解析与应用:深度剖析正则表达式的威力,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》本专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

正则表达式解析与应用:深度剖析正则表达式的威力

  • 概述
  • 正则表达式简介
  • 正则表达式的基本语法
  • 正则表达式的高级语法
  • 实战应用示例
        • 提取图片标签中的链接
        • 匹配IPv4地址
        • 匹配HTML注释
        • 邮箱验证
        • URL提取
        • HTML标签匹配
        • 验证身份证号(15位或18位数字)
        • 验证手机号码
        • 只能输入数字
        • 验证域名
  • 总结

概述

正则表达式是一种强大的文本匹配和处理工具,它在各种编程语言和文本编辑器中广泛应用。本文将深入解析正则表达式的概念、语法、常见用法以及在实际应用中的技巧。

正则表达式简介

正则表达式是一种用于描述字符串模式的表达式。它可以用来匹配、查找、替换文本中的字符串,具有强大而灵活的文本处理能力。正则表达式不仅仅是一种语法,更是一种强大的字符串处理思维方式。

正则表达式的基本语法

字符类

普通字符: 例如,a 匹配字符 a
转义字符: 使用反斜杠\转义特殊字符,如 \.匹配点号 .

元字符

.(点号): 匹配任意字符,除了换行符
^ 匹配字符串的开始
$ 匹配字符串的结束

字符集合

[...] 匹配括号内的任意一个字符
[^...] 匹配除了括号内字符的任意一个字符

量词

* 匹配前一个元素零次或多次
+ 匹配前一个元素一次或多次
? 匹配前一个元素零次或一次
{n} 匹配前一个元素恰好 n 次
{n,} 匹配前一个元素至少 n 次
{n,m} 匹配前一个元素至少 n 次但不超过 m 次

正则表达式的高级语法

转义与原始字符串
在正则表达式中,某些字符有特殊含义,如 .* 等。如果想匹配这些字符本身,需要使用反斜杠进行转义。在某些编程语言中,为了简化正则表达式的书写,还可以使用原始字符串(Raw String)来避免双重转义。例如,在Python中:

# 非原始字符串
pattern = "\\d+"# 原始字符串
pattern_raw = r"\d+"

非捕获分组
有时我们需要使用分组来对正则表达式的一部分进行重复,但又不希望捕获这个分组,可以使用非捕获分组 (?:...)。例如:

(?:https?://)?([^/\s]+)(/[^\s]*)?

上述正则表达式可以匹配 URL,但只捕获了主机名和路径,而不捕获协议部分。

后向引用
后向引用允许在正则表达式中引用先前匹配的子表达式,使用 \1\2等来表示。这在需要匹配对称字符(如括号)或重复出现的模式时非常有用。例如:

(\w)\1

上述正则表达式匹配连续两个相同的字母。

零宽断言
零宽断言是一种先行或后顾条件的匹配,但并不包含在最终的匹配结果中。它包括正向先行断言 (?=...)、负向先行断言 (?!...)、正向后顾断言 (?<=...) 和负向后顾断言 (?<!...)。例如:

(?<=@)\w+

上述正则表达式匹配 @ 后面的字母字符,但不包括 @。

命名分组
为了方便引用,我们可以给分组命名,使用 (?<name>...)(?'name'...)。例如:

(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})

实战应用示例

提取图片标签中的链接
<img[^>]*src=['"]([^'"]+)['"][^>]*>
匹配IPv4地址
\b(?:\d{1,3}\.){3}\d{1,3}\b
匹配HTML注释
<!--.*?-->
邮箱验证
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
URL提取
https?://[^\s]+
HTML标签匹配
<[^>]+>
验证身份证号(15位或18位数字)
^\d{15}|\d{18}$
验证手机号码
^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$ 
只能输入数字
//限制只能输入数字
^[0-9]*$
//整数或者小数
^[0-9]+\.{0,1}[0-9]{0,2}$
验证域名
[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.? 

总结

正则表达式作为文本处理的得力助手,在处理字符串时展现出强大的功能。通过深入理解正则表达式的语法和技巧,我们能更加高效地进行文本处理和匹配,为程序开发、数据清理等场景提供强大的支持。希望通过本文的介绍,大家能够更加深入地掌握正则表达式的使用方法,发挥其强大的匹配和处理能力。

这篇关于正则表达式解析与应用:深度剖析正则表达式的威力的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/574178

相关文章

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

在Rust中要用Struct和Enum组织数据的原因解析

《在Rust中要用Struct和Enum组织数据的原因解析》在Rust中,Struct和Enum是组织数据的核心工具,Struct用于将相关字段封装为单一实体,便于管理和扩展,Enum用于明确定义所有... 目录为什么在Rust中要用Struct和Enum组织数据?一、使用struct组织数据:将相关字段绑

使用Java实现一个解析CURL脚本小工具

《使用Java实现一个解析CURL脚本小工具》文章介绍了如何使用Java实现一个解析CURL脚本的工具,该工具可以将CURL脚本中的Header解析为KVMap结构,获取URL路径、请求类型,解析UR... 目录使用示例实现原理具体实现CurlParserUtilCurlEntityICurlHandler

深入解析Spring TransactionTemplate 高级用法(示例代码)

《深入解析SpringTransactionTemplate高级用法(示例代码)》TransactionTemplate是Spring框架中一个强大的工具,它允许开发者以编程方式控制事务,通过... 目录1. TransactionTemplate 的核心概念2. 核心接口和类3. TransactionT

数据库使用之union、union all、各种join的用法区别解析

《数据库使用之union、unionall、各种join的用法区别解析》:本文主要介绍SQL中的Union和UnionAll的区别,包括去重与否以及使用时的注意事项,还详细解释了Join关键字,... 目录一、Union 和Union All1、区别:2、注意点:3、具体举例二、Join关键字的区别&php

Spring IOC控制反转的实现解析

《SpringIOC控制反转的实现解析》:本文主要介绍SpringIOC控制反转的实现,IOC是Spring的核心思想之一,它通过将对象的创建、依赖注入和生命周期管理交给容器来实现解耦,使开发者... 目录1. IOC的基本概念1.1 什么是IOC1.2 IOC与DI的关系2. IOC的设计目标3. IOC

java中的HashSet与 == 和 equals的区别示例解析

《java中的HashSet与==和equals的区别示例解析》HashSet是Java中基于哈希表实现的集合类,特点包括:元素唯一、无序和可包含null,本文给大家介绍java中的HashSe... 目录什么是HashSetHashSet 的主要特点是HashSet 的常用方法hasSet存储为啥是无序的