正则表达式

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

1.普通字符

普通字符主要讲解以下内容,并举例说明

1) String regStr = \”[a-z]\”;//匹配a-z中任意一个字符

结果展示

2) String regStr = \”[A-Z]\”;//匹配A-Z中任何一个字符

结果展示

3)String regStr = \”abc\”;//匹配字符串abc

结果展示

4)String regStr = \”(?i)abc\”;//匹配字母abc不区分大小写

结果展示

5) String regStr = \”[0-9]\”;//匹配0-9任何一个字符

结果展示

6) String regStr = \”[^0-9]\”;//匹配不是0-9中的任何一个字符

结果展示

2.限定符

1) *:表示出现任意次数,0次或者n次

结果展示

2)+:表示出现至少1次或者n次,如(abc)+表示abc出现1次或者多次

结果展示

3)?:表示出现至少0次或者1次,如abc?表示c出现0次或者1次

结果展示

4){n}:表示出现n次,如[0-9]{2},表示匹配2次数字

结果展示

5){n,}表示至少出现n次,如[0-9]{3,}表示匹配至少3次数字

结果展示

6){n,m}表示出现至少n次,最多m次,如[0-9]{2,4}表示匹配次数2-4次数字

结果展示

3.定位符

1) ^:表示字符串以什么开头的意思

结果展示

2) $:表示字符串以什么结束的意思

没有匹配到,因为要以数字结束

3) \\\\b:表示边缘匹配(字符串的结尾或者空格之后)

匹配到的是最后一个“zyp”

4) \\\\B:与\\\\b相反

匹配到的是第一个“zyp”

4.分组

1)如(\\\\d\\\\d)(\\\\d\\\\d)表示匹配4位数字,如果字符串为2021abcd,

结果展示

结论:由此可见()会将正则分组,并按顺序给出编号,从1开始

2)(?<a1>\\\\d\\\\d)(?<a2>\\\\d\\\\d)表示匹配4位数字,如果字符串位2021abcd

结果展示

结论:由此可见()除了能将正则分组,还能按顺序给出编号,从1开始。还可以给分组取名字,并根据名字获取对应匹配的值

1)如20(?:20|21|22)表示匹配2020|2021|2022

结果展示

2)如20(?=20|21|22)表示匹配2020或2021或2022中的20

这里匹配到的20,为2021和2022中的20

3)如20(?!20|21|22)表示匹配不匹配2020或2021或2022中的20,匹配其它20

这里匹配到的20为2023中的20

5.反向引用

字符串12345678870008,正则为(\\\\d)(\\\\d)\\\\2\\\\1

结果展示

正则表达式详解

正则表达式(Regular Expression)

正则表达式你可以它当作是通配符的增强,它所作的事情就是帮你匹配指定规则的字符串,而且它在计算机的应用可能远比你想象得要多的多。

我们平时编辑器中的词法分析器会使用正则表达式去匹配代码中的关键字。网站上的注册表单会用到正则表达式去判断密码的复杂程度。在爬虫中,我们同样可以使用正则表达式提取我们需要的信息。

今天通过这样一篇文章给大家详细讲一下正则表达式的规则,让大家熟练掌握正则表达式的使用。

如果觉得这篇文章对你有帮助的话,欢迎大家点赞,收藏!

首先介绍一下今天要用到的工具:

为了测试你写的正则表达式,这里有很多种办法,我们可以使用编辑器内置的搜索工具,比如在vscode中点击这个图标

当然我们也可以在自己熟悉的编程语言中调用函数去测试它

这里我推荐一个在线的测试工具:regex101.com

我们首先看一下正则表达式中最基础的用法

//限定符(Quantifiers)

//1

这里的**?**在正则表达式中是一个特殊的字符,它是一个限定符,它代表前面这个字符d需要出现0次或者1次,说简单点就是d这个字符可有可无,可以看到我们用这个表达式可以去匹配use这个单词,同样也可以去匹配used.

//2

这里的*表示b可以没有,也可以出现很多次,可以看到它成功匹配了下面的ac,abc,和abbbbbbc,但是没有去匹配adc.

//3

这里的+,和*不同的是它会匹配出现【1】次以上的字符

//4

这里的{6}表示b出现6次,可以看到它成功匹配了下面的abbbbbbc.

这里{2,6}表示b出现的次数在2~6之间

如果希望出现的字符出现在2次以上,则可以省略6,直接写{2,}.

上面讲的是对单个字符进行操作,如果希望对多个字符进行操作,应该怎么办呢?

//5

可以将要匹配的字符括起来,然后在后面加限定符,可以看这个正则表达式成功匹配了多次ab的出现

//或 运算符(OR Operator)

//1

这里我们要去匹配a cat或者a dog,我们可以将正则表达式写成这样a (cat|dog),这里前面先去匹配a,后面括号的内容代表要么是cat,要么是dog,中间以竖线隔开,并且注意这里的括号是必不可少的,否则就成了要么事a cat,要么事dog

//字符类(Character Classes)

//1

比如想要匹配abc这几个字母构成的单词,我们可以写成[abc]+,方括号里的内容代表要求匹配的字符只能取自它们,另外我们可以在方括号里指定字符的范围

比如[a-z]代表所有小写的英文字符,[a-zA-Z]代表所有的英文字符,[a-zA-Z0-9]代表所有的英文字符和数字,如果在方括号的前面我们写一个尖号(^),则代表要求匹配除了尖号后面列出以外的字符

比如[^0-9]代表所有的非数字字符(包括换行符)

//元字符(Meto-characters)

\\d:数字字符

\\w:单词字符(英文、数字及下划线)

\\s:空白符(包括Tab和换行符)

\\D:非数字字符

\\W:非单词字符

\\S:非空白字符

.:任意字符(不包含换行符)

^:匹配行首

$:匹配行尾

//贪婪与懒惰匹配(Greedy vs Lazy Match)

假如我们要去匹配这个里面的标签,我们自然会想到这样的正则表达式<.+>,但这里可以看到这个表达式会直接把整个字符串都匹配了,原因是因为中间的这个.+会尽可能的匹配字符,我们知道.能代表任意字符,自然也会匹配>,因此才会有这样得结果,解决方法也很简单

我们在+右边加一个?就好了,它会将正则表达式中默认的贪婪匹配切换为懒惰匹配,这招在实际使用当中会经常用到

下面我们来看一些实例

//实例1:RGB 颜色值匹配

比如这里我们想要匹配文本中出现的所有十六进制RGB颜色值

我们首先去匹配前面的#,接下来由于每一个颜色的字符都是十六进制,因此它们只能取自a-f之间,或者大写的A-F或者0-9之间,并且字符一定需要出现6次,最后我们在表达式末尾加入\\b来代表单词字符的边界,这样可以避免最下面的#ffffffff也被识别RGB颜色值。

//实例2:IPV4地址匹配

IPv4的地址实际是由四段数字构成,数字之间由句点隔开,如果要在文本中提取所有的IP地址,我们可以直接使用\\d+.\\d+.\\d+.\\d+这个表达式

.代表.这个字面量,因为.在正则表达式是一个特殊符号,所以我们这里需要用反斜杠作转义,不过这里有个问题,我们知道IP地址的每个部分都是8位的数字,也就是说它的范围介于0-255之间,但是上面的256很显然超过了这个范围,但是还是被正则表达式匹配了,所以如果这里我们要做改良

我们可以使用下面这段逻辑,我们先来看IP地址被句点隔开的每一部分,如果它前面两位是25,那么最后一位只能取0-5之间的数字,如果它的第一位是2,第二位是0-4之间的数,那么最后一位可以取0-9之间的数字,这里用\\d表示,如果它第一位是0或者1,那么最后两位可以取00-99之间的任意数字,我们用\\d\\d表示,但是我们也知道IP地址的每一部分也可以由两位数字构成,甚至是一位,这样都是合法的,因此我们可以直接将这里的第一个数字和第三个数字后面都加一个?,就可以表示这种情况了,数字部分我们就匹配完了,接下来我们来匹配后面的句点,然后将全部表达式用括号括起来,这一段我们重复三次,这样正则表达式会取匹配IP地址的前三段,并且包含每一段后面的句点,至于最后面的一段数字我们只需要将第一段数字的这一部分复制过来即可,最后在首尾加入\\b来匹配字符的边界。

可以看到经过改良版的表达式可以成功匹配这里的三个IP地址,并且把不符合要求的排列在外

最后列了一张表,总结一下今天讲到的所有点

难倒很多程序员的正则表达式是什么?一文看懂神奇的正则表达式

大家好,我是猴哥!猴哥出品,必是精品,点击关注,给你好看!

持续更新通俗易懂的技术知识,为您护航充电!

本文章节内容

  • 什么是正则表达式?—一个例子看懂
  • 正则符号详解之普通元字符 —[a-z]比N行代码好用多了
  • 正则符号详解之特殊字符 —简洁版的元字符
  • 正则符号详解之扩展表示法字符 —比算法都好用
  • 两个实用的正则表达式 —够你写半天的代码

本文将对正则表达式进行完整的介绍,以通俗易懂的语言对正则表达式的每个字符功能进行详细解释并通过具体示例进行补充说明旨在让广大读者朋友们迅速掌握正则表达式这项工作技能并加以出色的运用,助力读者朋友们在脚本语言(Python、JavaScript等)盛行的互联网时代脱颖而出!

正则表达式

一、神奇的正则表达式是什么?

为让读者朋友们先对正则表达式有个大致的概念,本节我们将通过一个非常简单的示例来解释正则表达式到底是什么?如:

正则表达式:[0-9]+

表达式解析:[0-9]表示一位0-9之间的任意数字,注意[0-9]只表示一位数字,+ 号表示前一个正则表达式表示的字符至少重复出现1次以上

表达式功能:表示一位以上的数字,如1,123,,134646757658……除数字外的字符串都不符合该正则表达式

从上例中可以看出,正则表达式其实就是一个描述一种字符串元素组成的符号表达式,字符串只有符合这种格式才是正确的,可以实现一种过滤逻辑功能!

正则表达式虽然描述的是一种字符串元素组成的表达式,但在实际编程应用中是以正则表达式描述的字符串格式来匹配查找对应字符串的。正则表达式可用于各种字符串的检查、验证、查找、提取等程序功能开发,如检查身份证号、密码、账户名等场合

正则表达式

下面我们将对正则表达式的所有符号及其功能进行详细的讲解,保证读者朋友们能够看懂正则表达式并编写简单的正则表达式,待大家融会贯通之后结合扩展正则符号,编写设计复杂且具有强大功能的正则表达式也将不在话下!

神奇的正则表达式

正则表达式是一种由各种符号组成的逻辑公式,本文将把正则符号分为三大类:普通元字符、特殊字符、扩展表示法字符。下面将介绍第一类:正则表达式中的普通元字符!

二、正则符号详解之普通元字符

普通元字符只有十多个,考虑到理解难度问题,我们将对每个元字符以通俗易懂的语言进行再解释,并结合多个示例再说明,让读者朋友们能够理解更深刻。先来看看正则表达式中的普通元字符有哪些?如下图:

普通元字符集

先来看普通元字符功能与示例:

元字符1: value —表示与value字面字符一致的查找功能,如

  • abc:表示匹配查找含abc的字符串,例如可匹配查找123abc456、abcdef中的abc

元字符2:regex1|regex2 —表示正则表达式regex1regex2,如

  • abc|123:表示查找含abc或123的字符串,例如可查找123abc456、abcdef123中的abc和123

元字符3:.(点)—表示查找除空格和空行之外的任何单个单字符,如字母,数字,符号等等

元字符4:^ —匹配查找字符串起始部分,如

  • ^abc:匹配查找字符串开头为abc的字符串,例如可匹配查找abcdef中的abc,不可匹配查找ababcdef中的abc

元字符5:$ —匹配查找字符结尾部分,如

  • abc$:匹配查找字符串结尾为abc的字符串,例如匹配查找defabc中的abc,不可匹配查找abcdef中的abc

元字符6:* —*前的第一个正则表达式表示的字符至少出现0次以上,如

  • [0-9]*:[0-9]表示一位数字,那么[0-9]*表示匹配查找出现0次以上的数字字符串

元字符7:+ —+前的第一个正则表达式表示的字符至少出现1次以上,如

  • [0-9]+:[0-9]表示一位数字,那么[0-9]+表示匹配查找出现1次以上的数字字符串

元字符8:? —前的第一个正则表达式表示的字符出现0次或1次

元字符9:{N} —{N}前的第一个正则表达式表示的字符出现N次,如

  • [0-9]{2}:表示匹配查找由2位0-9之间的数字组成的字符串

元字符10:{X,Y} —{X,Y}前的第一个正则表达式表示的字符出现X到Y次,如

  • [0-9]{3,6}:表示匹配查找由3到6位0-9之间的数字组成的字符串

元字符11:[…] —匹配查找…中的任意单个字符,如

  • [abc]:表示匹配查找含a或b或c字母的字符串

元字符12:[p-q] —范围描述,匹配查找p-q范围中任意单个字符,如

  • [0-9]:表示匹配查找0-9之间的任意单个数字

元字符13:[^…] —非描述符匹配查找不属于表示的任意单个字符,如

  • [^A-Z]:不匹配查找A-Z之间的大写字母
  • [^abc]:不匹配查找字母a或b或c

元字符14:(…) —一个封闭的正则表达式,如

  • ([A-Z]{2}):匹配查找两个大写字母

对于上面的元字符及其功能,读者朋友们可能还是不清楚具体怎么使用,我们举个实际编程应用中的例子为大家说明。要求:编写程序检查用户输入的内容是否是纯数字,下图是编程解决方案:

  • ^[0-9]+$ — 开头结尾都是数字,中间也为数字,中间一位数字重复出现1次以上

正则表达式检查数字

三、正则符号详解之特殊字符

正则表达式的第二类正则符号—特殊字符,可以理解为简洁版的普通元字符,常见的特殊字符有:

以下是文字描述,便于读者复制保存:

特殊字符1:\\d —表示匹配查找单个数字字符,等价于[0-9]

特殊字符2:\\D —表示不匹配查找单个数字字符,等价于[^0-9]

特殊字符3:\\w —表示匹配查找单个字母或数字字符,等价于[a-zA-Z0-9]

特殊字符4:\\W —表示不匹配查找单个字母或数字字符,等价于[^a-zA-Z0-9]

特殊字符5:\\b —表示匹配查找单词(字符到空格直接的字符串)边界,如

  • \\bab:表示可匹配查找able、abnormal等单词中的ab,不能匹配cable中的ab
  • y\\b:表示可匹配查找enjoy、city等单词中的y,不能匹配ayc_13ab中的y

特殊字符6:\\B—表示不匹配查找单词边界,如

  • ew\\B:表示可匹配查找yavewafg中的ew,但不能匹配查找new中的ew

特殊字符7:\\s—表示匹配查找空字符,等价于[\\n\\t\\r\\v\\f](换行符/制表符/回车符/垂直制表符/换页符/)

特殊字符8:\\S—表示不匹配查找空字符,等价于[^\\n\\t\\r\\v\\f]

特殊字符9:\\A—表示匹配查找字符串开头,等价于 ^

特殊字符10:\\Z—表示匹配查找字符串结尾,等价于 $

特殊字符11:\\x—类似编程中的转义字符,表示匹配查找特殊字符,如

  • \\?:匹配查找问号
  • \\.:匹配查找点号
  • \\*:匹配查找星号
  • \\+:匹配查找加号
  • ……

四、正则符号详解之扩展表示法字符

提到正则表达式的扩展表示法时,要给大家强调一下,扩展表示法字符实用的只有四个,分别是:(?=…)、(?!…)、(?<=…)、(?<!…)。需要说明的是(?:)与扩展表示法根本就不是一类,尽管很多书籍将其归为扩展表示法,但实际上它只是形式相似而已,所以读者朋友们不必过度在意这个字符,本文也不做赘述。

在详细介绍四种扩展表示法之前,我们先要说明一个概念——断言,又叫预查或环视,先来看术语解释:

四种扩展表示法

什么意思呢?下面我们来看解释,比如说你想提取某个文本中的IP地址,如192.168.***.***,但文本中存在一种情况“56192.168.***.***6564”,虽然这个字符串中存在192.168.***.***,但显然它不是有效的IP地址,也就是说我们在查找IP地址 192.168.***.***的时候,其前后都不能是数字,那么我们就需要提前查看或者环视周围,扩展表示法就起到了这样的作用,如匹配查找office单词:

  • office(?=2003|2007|365):只能匹配查找office2003或者office2007或office365中的office,无法匹配office2010中的office,匹配结果只包含office,称为非获取匹配查找
  • office(?!2003|2007|365):可以匹配查找office2010中的office,而无法匹配office2003或者office2007或office365中的office,匹配结果只包含office,称为非获取匹配查找
  • (?<=上海|北京)人:只能匹配查找上海人或北京人中“人”,而无法匹配广州人中的“人”,匹配结果只包含“人”,称为非获取匹配查找
  • (?<!上海|北京)人:只能匹配查找非上海人或北京人中“人”,如广州人中的“人”,而无法匹配上海人或北京人中“人”,匹配结果只包含“人”,称为非获取匹配查找

关于具体的编程应用案例,感兴趣的读者朋友可以直接用今日头条app上方的搜索框输入:“程序员水平进阶之正则表达式”,进入专栏进行查看:

头条搜索

五、附上两个实用的正则表达式

关于以下两种正则表达式的详细解释可参见文章“程序猿技能进阶:设计一条检查用户名是否合法的正则表达式”与文章“程序猿技能进阶:一条正则表达式检查用户密码的合法性”。

★ 检查用户名是否符合要求的正则表达式:

//要求一:用户名必须以字母开头

//要求二:用户名只能包含大小写字母、数字、下划线

//要求三:总长度为6~16位

//用于检查验证用户名是否符合上述要求的正则表达式:^[a-zA-Z][a-zA-Z0-9_]{5,15}$

★ 检查用户密码设置是否符合要求的正则表达式:

正则表达式:((?!^[0-9]+$)(?!^[A-Z]+$)(?!^[a-z]+$)(?!^[^A-Za-z0-9]+$))^.[^\\s]{8,16}$

注:((?!…)(?!…))之间是同时满足的意思

表示由大小写英文字母与数字混合组成的6到16位密码

文中如有不妥之处,敬请批评指正

读者朋友们对于本讲内容中有任何疑问,都可以通过评论、私信等方式留言,与其他读者或者本人进行交流讨论,在下将鼎力协助!

正则表达式

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。