阿里程序员带你全面深入了解正则表达式

阿里巴巴QLExpress_轻量级 Java 表达式解析引擎的全面解析 轻量级:体积小,依赖少,易于集成到现有项目中。高性能:解析和执行效率高,适合对性能要求较高的应用场景。易用性:提供简洁的 API,易于上手和使用。灵活性:支持多种类型的表达式,包括算术、逻辑、字符串、日期时间等。可扩展性:支持自定义函数和变量,可以根据业务需求进行扩展。= 2) {throw new Exception("参数数量不正确");} }= 2) {throw new Exception("参数数量不正确");} }= 2) { 阅读详情

在日常工作中,经常会用到正则操作。但是对于大多数人来说,操作正则表达式简直就是抓瞎。

本篇文章主要整理了正则表达式匹配的规则,使用中的一些要点,以及用图形化的方式列举出一些常见的正则表达式,希望能给大家带来一定的帮助,能在以后的工作中,用上正则,爱上正则。

PS:不同语言中的正则表达式的规则不完全相同,但是大部分都可以适用。

正则是什么

正则表达式是为了对字符串进行有效 数据提取 以及 匹配 的一种机制,字符串在匹配的过程中将会从第一个位置开始匹配,然后从左往右进行依次匹配,每尝试匹配一次,就会把控制权交由下一个位置,直到匹配结束。

正则表达式是由 普通字符(例如字符 a 到 z)以及 特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。

正则的诞生

正则表达式的“祖先”可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloch 和 Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。

1956 年, 一位叫 Stephen Kleene 的美国数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为「神经网事件的表示法」的论文,引入了正则表达式的概念。

正则表达式就是用来描述他称为“正则集的代数”的表达式,因此采用“正则表达式”这个术语。

随后,人们发现可以将这一工作应用于使用Ken Thompson 的计算搜索算法的一些早期研究,Ken Thompson是Unix 的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的qed 编辑器。从那时起直至现在正则表达式都是基于文本的编辑器和搜索工具中的一个重要部分。具有完整语法的正则表达式使用在字符的格式匹配方面上,后来被应用到熔融信息技术领域。自从那时起,正则表达式经过几个时期的发展,现在的标准已经被ISO(国际标准组织)批准和被Open Group组织认定。

匹配规则

下面将正则中的一些基本的匹配规则列出来如下表所示:

640?wx_fmt=png

要点

贪与不贪

举个例子,假设有以下这段html字符,我想拿到a标签中的内容:

<a>南京长江大桥</a>哈哈<a>南京市长江大桥</a>

然后我写了这样一个正则: <a>(.)*</a>

在线测试的结果如下:

640?wx_fmt=png

这个结果与我们的预期不符,正常我应该得到两个匹配的结果才对,但是现在却只匹配到一个结果。

现在把刚刚的正则改成这样: <a>(.)*?</a>

在线测试的结果如下:

640?wx_fmt=png

贪 说的是正则在不约束的情况下会继续自动向右进行匹配,直到匹配结束,只要匹配的数据与正则的最后一个值匹配就算是匹配到了。

不贪 说的是只要匹配到就结束,不继续向右进行匹配了。

问号 ? 就解决了贪婪的问题,使得问号前面的字符匹配到之后就结束,但是并不是把 ?放在哪里都可以解决贪婪的,在正则里,有一些属于贪婪模式量词,比如以下这些:

{m,n}	
{m,}	
?	
*	
+

断言与零宽

在java中我们知道 断言 可以用来声明一个应该为 true 的事实,只有当断言为真时才会继续进行后续的操作。

在正则中也有 断言 的概念,但是在正则中除了 断言 还有 零宽 的概念。

  • 断言:

通俗点将断言就是 “我断定某某情况是真的” ,而正则中的断言,就是说正则可以断定在 指定的内容 的 前面 或 后面 会出现满足指定规则的内容。比如 "aa1bb2cc3",正则可以用断言找出 bb2 前面有 aa1,也可以找出 bb2 后面有 cc3。

  • 零宽:

零宽就是没有宽度,在正则中,断言只是匹配位置,不占字符,也就是说,匹配结果里是不会返回断言本身的。

断言一共有四种情况:

640?wx_fmt=png

让我们来举个例子来说明吧,假设我们现在拿到了某个网页的html,里面有个阅读数的标签:

<span class="read-cnt">阅读数:1024</span>

现在我们要获取到这个阅读数,该怎么办呢?

如果用正向先行断言来匹配的话,可以这样来写:

\d+(?=</span>)

上述的表达式就是说明,我现在断言整数 \d+ 的 后面 能 匹配表达式: </span>

让我们来验证下结果:

640?wx_fmt=png

相应的正向后行断言可以这样写表达式:

(?<=阅读数:)\d+

上述的表达式就是说明,我现在断言整数 \d+ 的 前面 能 匹配表达式: 阅读数:

验证下结果如下:

640?wx_fmt=png

分组

正则表达式中用小括号 () 来做分组,也就是括号中的内容作为一个整体。

因此当我们要匹配分组 he 的时候,可以用下面这个表达式 :

(he)

640?wx_fmt=png

我们看到正则表达式用小括号来做分组,那么问题来了:

如果要匹配的字符串中本身就包含小括号,那应该怎么办?

针对这种情况,正则提供了转义的方式,也就是要把这些元字符、限定符或者关键字转义成普通的字符,做法很简单,就是在要转义的字符前面加个斜杠(\)即可。

因此当我们要匹配分组 (he) 的时候,可以用下面这个表达式 :

(\(he\))

640?wx_fmt=png

下面我们用一个正则表达式的图形生成工具,做一个对比的实验,让我们对分组和定位有个了解。

1:匹配 he 分组一次 ;

640?wx_fmt=png

2:匹配 he 分组零或多次;

640?wx_fmt=png

3:匹配以 he 开头的分组一次;

640?wx_fmt=png

4:匹配以 he 开头的分组零或多次

640?wx_fmt=png

捕获与反向引用

单纯说到捕获,他的意思是匹配表达式,但捕获通常和分组联系在一起,也就是“捕获组”。

捕获组:

匹配子表达式的内容,把匹配结果保存到内存中以数字编号或显示命名的组里(可以把它想象为java中的array和map),以深度优先进行编号,之后可以通过序号或名称来使用这些匹配结果。

捕获组的表达式为: (exp) ,这个语法跟上面讲到的分组的概念是一样的,只是捕获将匹配到的分组,保存在了内存中,留待后面使用。具体怎么时候他不管,他只需要把匹配到的分组保存在内存中就可以了。

有一种情况当在匹配的过程中,需要与已经捕获到的分组进行匹配,这时就需要使用到保存在内存中的捕获组了,这种使用方式就被称为: 反向引用 。

假设我有这样一段文字:

aa12bb23cc34

现在我想拿到成对的字符,该怎么做呢?这种情况下通过断言或者其他方式是办不到的,那我们能否在匹配的过程中将匹配到的一个字符先保存在内存中,然后匹配下一个字符时再与上一个字符相比较,如果相等,就说明匹配成了,拿到了成对的字符了。

那首先我们先要写一个匹配单个字符分组的表达式:

(\w)

那当匹配时捕获到一个字符分组时,我们需要将该字符引用出来,与下一个字符想比较,我们期望匹配的下一个字符也与我当前保存的字符相等,那么表达式就变成了这样:

(\w)\1

这里的 \1 表示的是,当前正则表达式匹配到的 第1个 分组,那就意味着, \2 表示 第2个 分组。

做个测试,结果如下:

640?wx_fmt=png

那如果我想再匹配复杂一点的结果,比如:XYY 这种的结果,又该怎么写呢?

其实有了上面的基础之后就很简单了,我们需要做的就是 对捕获到的第2个分组进行反向引用 就可以了!

具体的表达式为:

(\w)(\w)\2

测试结果如下:

640?wx_fmt=png

表示成图形就是这样:

640?wx_fmt=png

常见正则

为了更加形象的了解正则表达式,我们最后通过图形的方式来了解一些常见的正则表达式,使用图形的目的是希望能对冷冰冰的表达式有个更深刻的认识。

640?wx_fmt=png

以下是一些常见正则的表达式与图片,可能有些过时了,如电话号码出现了新的号段,但是大体上应该没有问题。

整数

[0-9]+

640?wx_fmt=png

逗号分隔的整数

\b[0-9]{1,3}(,[0-9]{3})*\b

640?wx_fmt=png

浮点数

(\+?(\d+|\.\d+|\d+\.\d+)|-?(\d+|\d+\.\d+))

640?wx_fmt=png

0-255之间的数字

^([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])$

640?wx_fmt=png

身份证

^[1-9]\d{14}(\d{2}[0-9x])?$

640?wx_fmt=png

邮箱

^[-\w.]{0,64}@([a-zA-Z0-9]{1,63}\.)*[-a-zA-Z0-9]{1,63}$

640?wx_fmt=png

固定电话

(\(?0[1-9]{2,3}\)?-?)?[1-9][0-9]\{6,7}(-[0-9]{1,6})?

640?wx_fmt=png

邮编

[1-9][0-9]{5}

640?wx_fmt=png

ISBN

((ISBN(-13)?:?\s)?97[89][-\s]?[0-9][-\s]?[0-9]{3}[-\s]?[0-9]{5}[-\s]?[0-9]|(ISBN(-10)?:?\s)?[0-9][-\s]?[0-9]{3}[-\s]?[0-9]{5}[-\s]?[0-9x])

640?wx_fmt=png

手机号

(0|\+86)?(13[0-9]|15[0-356]|18[025-9])\d{8}

640?wx_fmt=png

成对的html标签

如 test

<([^>]+)>[\s\S]*?<\/\1>

640?wx_fmt=png

a标签
<a\s+href\s*=\s*["']?([^"'\s]+)["']?>([^<]+)<\/a>

640?wx_fmt=png

head标签
<head>([^>]+)<\/head>

640?wx_fmt=png

image标签
<img\s[^>]*?src=['"]?([^"']+)["']?[^>]*>

640?wx_fmt=png

正则思维导图

640?wx_fmt=png

附常用工具:

在线正则测试:http://tool.oschina.net/regex/

生成正则图片:https://regexper.com

640?wx_fmt=png

关注「码洞」,老钱带你码出个未来

640?wx_fmt=png

关注阿里程序员「后羿逐码」

初中高级前端程序员的差距在哪里 本人前大厂前端工程师,《javascript设计模式》作者张容铭,目前专注于前端方面的教学。 首先可以明确的是每个技术都有一定的时间累积,那么在这时间的累积下面,不同的人技术水平肯定不一样,那么对于大多数前端来说前端技术能力究竟差在哪里呢? 下面对每个程序员进行一个归类的总结初级程序员仅能完成简单模块和项目的开发工作,难以胜任复杂模块的开发。通常是入行不久,1 年及以下工作经验的同学。能力要求熟... 阅读详情

相关推荐

国家编码和手机号编码(+86)(包括阿里版、腾讯版、所有版)

国家编码和手机号编码(+86)(包括阿里版、腾讯版、所有版)

规则引擎与表达式语言

首先,规则引擎有一定的学习成本,即使开发人员使用也需要进行专门的学习,更何况没有任何编程背景的业务人员,其次,其实现的复杂度也高,如果业务规则复杂,规则制定者对规则引擎内部隐藏的程序流程不了解,很可能会得到意想不到的结果,最后,有些规则引擎还存在性能瓶颈。第 2 组 JUEL,QlExpress,OGNL 和 SpEl,性能由优到差依次是 OGNL,SpEl,JUEL,QlExpress。该语言的语法与 Unified EL 相似,但提供了更多的功能,其中最主要的是方法调用和基本的字符串模板功能。

vip_member888的博客 2052

C语言 函数

一、什么是函数 二、函数的相关语法 三、函数编码规范

m0_57105760的博客 1891

qlExpess ,阿里巴巴规则引擎。简单使用

qlExpress阿里巴巴规则引擎的简单使用

weixin_46374990的博客 960

pip——【Fatal error in launcher: Unable to create process】的深度排查与修复指南

本文深度解析了Python包管理工具pip报错【Fatal error in launcher: Unable to create process】的根本原因与解决方案。该错误通常由Python解释器路径变更、虚拟环境损坏或多版本冲突导致。文章提供了从快速排查到彻底修复的完整指南,包括使用`python -m pip`命令绕过启动器、修复或重装pip、重建虚拟环境等核心方法,并给出了预防此错误的最佳实践。

weixin_29306261的博客 599

CentOS7上装不了最新Chrome?别折腾依赖了,试试这个老版本安装法(附103.0.5060.24 beta下载地址)

本文提供了在CentOS7上安装兼容版Chrome的详细指南,解决了因GLIBC版本限制导致的最新版Chrome无法安装的问题。推荐使用Chrome 103.0.5060.24 beta版本,并附有下载地址和完整安装步骤,包括禁用自动更新和配套工具安装,确保系统稳定性和功能完整性。

weixin_29289821的博客 570

腾讯阿里百度等各大公司关于正则表达式的题目及答案(附常见年龄网址金额匹配)

文章目录1.使用正则表达式匹配一个IPv4地址2.关于正则表达式,下列说法正确的是:3.简单描述一下正则表达式及其用途4.正则表达式A*B可以匹配5.正则表达式中,+代表什么意思()6.验证邮箱地址的正则表达式7.正则表达式(01|10|1001|0110)*与下列哪个表达式一样?8.写出一个只匹配英文和数字并只能是英文开头的正则表达式9.(1)为String类定义和实现一个简单的正则表达式模式匹...

HHH's Blogs 2221

STM32F4使用CUBEMX ADC定时采样+DMA

STM32、FFT、ADC、TIM

m0_62379750的博客 4224

一看就懂:正则表达式(1),2024年最新身为一个Golang程序员Context都没弄明白

于是我们发现,在不用正则表达式的时候,我们的代码量近30行,而使用了正则表达式,代码就浓缩为了1行,也就是说,使用正则表达式时可以简化我们的代码。比如:现在有 abcd 字符串,当我们用小括号把 c 包裹起来后,然后在字符串后面写上 \1,即 ab©d\1,则这里的 \1 就指 c,因为 \1 表示第1个小括号中的结果。比如:现在有 abcd 字符串,当我们用小括号把 c 包裹起来后,然后在字符串后面写上 \1,即 ab©d\1,则这里的 \1 就指 c,因为 \1 表示第1个小括号中的结果。

2401_84265802的博客 795

MRST开源油藏模拟:从入门到精通的全流程指南

本文全面介绍了MRST开源油藏模拟工具的使用方法,从环境搭建到核心功能实战,再到性能优化和工业级应用。MRST作为一款基于MATLAB的开源工具,为油藏工程师提供了强大的数值模拟能力,特别适合教学和科研场景。文章还分享了二次开发技巧和常见问题解决方案,帮助读者快速掌握油藏模拟技术。

beer8的博客 329

Android 15.0 系统开机屏幕设置默认横屏显示

在15.0的系统ROM产品定制化开发中,对于产品需求来说,由于是宽屏设备所以产品需要开机默认横屏显示,开机横屏显示这就需要从 两部分来实现,一部分是系统开机动画横屏显示,另一部分是系统屏幕显示横屏显示,从这两方面就可以做到开机默认横屏显示了

安卓兼职framework和app工程师的博客 721

阿里专家精心整理分享的Java程序员面试笔试通关宝典PDF

学习是一种基础性的能力。然而,“吾生也有涯,而知也无涯。”,如果学习不注意方法,则会“以有涯随无涯,殆矣”。学习就像吃饭睡觉一样,是人的一种本能,人人都有学习的能力。我们在刚出生的时候,什么也不知道,是一张真正的白纸,我们靠学习的本能,学会了走路、说话、穿衣服…后来,我们上学了,老师把书本上的知识一点一点灌输到我们的脑子里,我们掌握的知识越来越多,与此同时,我们学习能力却好像越来越差了,习惯了被别人喂饱,似乎忘记了怎么来喂自己了。

the shy 1012

[系统安全] 十六.PE文件逆向基础知识(PE解析和PE编辑工具)

您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更加聚焦,更加系统,更加深入,也是作者的慢慢成长史。换专业确实挺难的,逆向分析也是块硬骨头,但我也试试,看看自己未来四年究竟能将它学到什么程度,漫漫长征路,偏向虎山行。享受过程,一起加油~ 作者前面介绍了三个漏洞,包括Chrome浏览器保留密码渗透解析、通过Chrome浏

杨秀璋的专栏 1万+

Java程序员必备!java正则表达式匹配中文

前言 最近有很多朋友去目前主流的大型互联网公司面试(阿里巴巴、京东、字节跳动、蚂蚁金服、滴滴),面试回来之后会发给我一些面试题。有些朋友轻松过关,拿到offer,但是有一些是来询问我答案的。 我特意整理了一下,有很多问题不是靠几句话能讲清楚,所以整理了一些资料来解答这些面试题。很多问题其实答案很简单,但是背后的思考和逻辑不简单,要做到知其然还要知其所以然。 正文 做了 3~5 年编程开发,你已经积累了不少项目经验,扩宽了技术广度,也许已发力成为团队管理者。到了这个阶段,大家却常有这种感受:感觉自己卡在瓶颈进

m0_56662547的博客 776

39-高级优化技术:指令调度与乱序执行 - 手把手教你手写CPU

本文介绍了现代处理器设计中提高指令级并行性(ILP)的两种关键技术:指令调度和乱序执行。指令调度分为静态调度(由编译器完成)和动态调度(由硬件完成),后者能更好适应运行时情况但复杂度更高。乱序执行通过动态重排指令顺序提高硬件利用率,其核心组件包括重排序缓冲区、保留站和寄存器重命名。文章提供了保留站的Verilog实现示例,并分析了不同优化技术在性能、硬件开销和功耗方面的权衡。最终指出,CPU设计需根据性能、功耗等需求选择合适的优化技术。

2301_79143213的博客 86

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

解密初、中、高级程序员的进化之路

程序员的标准与要求 初级程序员 中级程序员(阿里 p5) 高级程序员(阿里 p6) 程序员的进化之路 初级 -> 中级 中级 -> 高级 总结 程序员的标准与要求 初级程序员 仅能完成简单模块和项目的开发工作,难以胜任复杂模块的开发。通常是入行不久, 1 年及以下工作经验的同学。 能力要求 熟悉前端基础知识如 HTML、JS、CSS 。 能够使用一门 MVVM 框架进行简单的业务开发...

weixin_45781748的博客 355

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

阿里P8大佬整理出来的Java程序员初、中、高级的进化之路

初级程序员 仅能完成简单模块和项目的开发工作,难以胜任复杂模块的开发。通常是入行不久, 1 年及以下工作经验的同学。 能力要求 熟悉前端基础知识如 HTML、JS、CSS 。 能够使用一门 MVVM 框架进行简单的业务开发。 遇到复杂的组件和模块,会找现有的轮子使用。 会使用百度、google 等检索工具搜索问题。 中级程序员(阿里 p5) 在必要的辅导或标准流程支持下,能独立负责一个子模块或者一个项目的具体任务,对及时性和准确性负责。通常是 2-3 年工作经验的同学。 能力要求 除了前端

马小果v:ma-xiaoguo的博客 297

假人有限元模型

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

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

爱了爱了,阿里出产的leetcode性能笔记,带你领略什么叫细节爆炸

在重复了几次痛苦的学习-梳理过程后,再去看一些独立的文章或者资料往往会事半功倍,因为能在体系内找到相对应的知识,甚至有时候一本书里一页只需要看一句话,点破那层窗户纸,就可以掌握新的知识。在重复了几次痛苦的学习-梳理过程后,再去看一些独立的文章或者资料往往会事半功倍,因为能在体系内找到相对应的知识,甚至有时候一本书里一页只需要看一句话,点破那层窗户纸,就可以掌握新的知识。最后实在忍不住,抱着厚书硬啃了一遍,突然有种豁然开朗的感觉:读书时自己学到的是一张完整的知识网络,每个知识点和其它内容相互联系和区别。

知识分享官 246

2024年Python正则表达式,这一篇就够了!_python 编写正则表达式(1),2024年最新2024阿里面试题

同样最后来一张思维导图总结一下re模块中的函数吧,需要高清图或者xmind文件的同学可微信扫描下方优快云官方认证二维码免费领取。

2401_84139728的博客 1117

初、中、高级程序员的区别有哪些

初级程序员仅能完成简单模块和项目的开发工作,难以胜任复杂模块的开发。通常是入行不久, 1 年及以下工作经验的同学。能力要求熟悉前端基础知识如 HTML、JS、CSS 。能够使用一门 MV...

小生方勤 2713

作为程序员,你最常上的网站是什么,理由是?

好用的网站在精不在多,我整理了这10个程序员必备网站,给我接好啦! 比格张 类型:网站检索(全类型) 推荐指数:★★★★☆ 理由:一个网站检索工具,上面有很多优秀的网站资源推荐,也带了搜索功能。涉及的类目很广,IT、医疗、法律、理财、媒体都有涵盖,工具型的检索网站。 作为一个通用型检索工具,我觉得它是非常实用的。 SimilarSites 类型:网站检索(针对性) 推荐指数:★★★★☆ 理由:比格张的延伸,适用于以下场景: 你很喜欢的网站被ban了,或是增加了一些shit一般的功能,想找个替代品。 你已经

九章算法的博客 2万+

解密初、中、高级程序员的进化之路(前端)

程序员的标准与要求 初级程序员 仅能完成简单模块和项目的开发工作难以胜任复杂模块的开发。通常是入行不久 1 年及以下工作经验的同学。 能力要求 熟悉前端基础知识如 HTML、JS、CSS 。 能够使用一门 MVVM 框架进行简单的业务开发。 遇到复杂的组件和模块会找现有的轮子使用。 会使用百度、google 等检索工具搜索问题。 中级程...

dengla6847的博客 204
上一篇: 一位非科班阿里程序员的 CTO 之路
下一篇: 《快学 Go 语言》第 14 课 —— 反射
码洞
博客等级 码龄10年 41粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值