一文带你快速掌握正则表达式

作者:叶筱    原载于:叶筱工作站公众号   发表时间:4月7日

 

     大家好,我是叶筱。我们在日常学习或者开发中,经常会遇到正则表达式,可以说正则无处不在。因为正则表达式在几乎所有语言中都可以使用,无论是前端的JavaScript、还是后端的Java、Python、C#。他们都提供了相应的接口或函数支持正则表达式。但是我们在大学选择的计算机专业课,或者在学习一些开发实战课中,都鲜有关于正则表达式的专门课程,很多本应该是正则表达式能完成的事情,却让大家用了其他稀奇古怪的表达方式;再或者,你在实际学习开发中,很明确这里是使用正则表达式,但是每次使用时,你都需要重新翻看资料,去重新理解正则表达式语法,以至于用到一些较为复杂的正则表达式就会被卡住,难以进行下去。

接下来我就用一篇文章,带大家一起快速上手正则表达式,本文共3000余字,预计需要10分钟。


目录

前言导入

1、元字符

2、贪婪、子组与环视

写在最后


前言导入

在开始之前,相信有许多小伙伴,还在问正则是什么东西?是啊,对于初次听到的同学肯定对“正则”充满了问号。

正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。

当然,艰涩难懂的概念很难让人理解它,甚至于还想收藏本文、然后关闭。其实正则你可以理解成一个文本处理工具,但是它非常强大。我们可以用它来校验数据的有效性,比如我们在平常注册账号或者填写表单的时候,但凡我们手机号出现错误,输入框就能及时提醒,这里就是利用了正则表达式进行校验;还有我们利用正则表达式可以快速从文本中提取需要内容,比如我们很常见的就是在网络爬虫中进行内容筛选和抓取;当然它还可以对符合规则的文本内容进行替换,比如Notepad++就是一个支持正则表达式的文本工具,我们可以轻松用它来把我们“千万级别”文中出现的指定内容进行替换,并且高效、快速、完全,妈妈再也不用担心我抄写作业了!

说到这里,可见正则表达式的重要性,那我们应该如何理解正则表达式呢?简单来说,它就是描述字符串的规则,最简单的正则就是匹配单个普通字符,例如我们在下面的例子中匹配字符o,这里就类似于我们平常常用的字符串查找是异曲同工的:

有时候我们还想找出字符串中符合某种规则的文本,比如找出字符串中的所有数字,如果用普通方法,肯定需要进行很多次重复工作,但是利用正则表达式就不一样了:

      这里就出来一个知识点,我们在正则中利用“d”(digit)来表示0-9这10个数字,如果我们在“d”后面加上一些量词变成“d{4}”,这样就会表示匹配4位的数字,这里大概许多小伙伴就能举一反三了,比如匹配手机号“d{11}”等等。

      我们接下来看一下,正则表达式如何进行替换,这里使用的是https://regex101.com/网站提供的正则表达式测试:

 

元字符

接下来我们先介绍一下元字符。元字符对于正则表达式是一个非常重要的基础概念,它是一种代表特殊含义的专用字符,相当于正则表达式中有含义的“单词”,只有掌握这些“单词”,在了解一些基础的“语法”,就能看懂初步看懂较为复杂的正则表达式。

        我们首先了解看下基础和空白符,这里包含的内容在之前我们举过的例子中展示过,还记得怎么初步匹配手机号码?对了,用“/d{11}”就可以了。

      这些都需要你牢牢去记住,尤其是大小写含义还不一样,千万不要写错,否则可能得到的答案和你想的大相径庭。

 

      我们往往并不是单独匹配一个字符,我们常常需要匹配一串字符,并且还对字符的内容有一定的期望,接下来我们来看一下量词和范围都有哪些内容:

      看到这里,我们就可以对一个手机号进行更加合理的匹配或校验,因为之前我们写的“/d{11}”可以匹配到手机号,但不完全都是手机号,例如00000000000明显就不是手机号,所以我们利用量词和范围对手机号的正则表达式重新进行改写:

我们可以看到,即便符合了手机号位数的数字也不会被匹配到,当然我们可以看到思维导图里面有许多同义替换,我们还可以这么写“1[^012]d{9}”、“1[3-9][0-9]{9}”等等。

 

有的时候,我们不仅需要匹配到我们想要的内容,并且所在的位置也必须是我们想要的,这时,我们就可以使用边界元字符来解决这个问题。

利用边界元字符我们可以从指定位置格式来匹配字符串,有效地过滤了许多不需要的信息,在这我们要对脱字符(^)和“A”进行一些区分,脱字符可以进行多行匹配,而\A只能匹配字符串开始的位置:

 

 

关于元字符的思维导图源文件,请在公众号“叶筱工作站”(CodeWorkstation)内回复“元字符”,即可获得源文件!

 

 

 

贪婪、子组与环视

   看到这里,对于正则表达式你已经跨入了大门,接下来我们来讲一下正则中的贪婪与非贪婪。在正则表达式中表示次数的量词默认是贪婪的,也就是说它尽可能多的去匹配符合要求的内容。

      那越多结果不是越好吗?为什么还要将贪婪模式变成非贪婪模式呢?非也,比如下面的例子,我想匹配引号内的内容,但是贪婪匹配让我匹配成第一个左引号和最后一个右引号内的内容,这明显是不符合我们需要的,变成非贪婪匹配就会得到想要的内容。

 

      我们有的时候需要进行一些复杂的匹配,可能需要多个正则表达式一起协作才能完成,就是所谓的分治法。这里我们需要利用正则表达式的子组来解决实际问题。

 

      我相信看这篇同学可能多少还对网络爬虫有一定了解,但是如何更加准确地匹配到指定标签的内容呢?这里我们就需要用到环视(Lookaround):

环视匹配的最终结果就是一个位置,匹配到的内容不保存到最终的匹配结果。这就好像要找某一个河南师大的门,它位于建设东路和牧野大道交叉口往北500米,我们根据这些线索就能确定这是河南师大的小东门,但我们只需要是什么门,结果并不包含这些找门的线索。所以环视的作用相当于对所在位置加了一个附加条件,只有满足这个条件,环视子表达式才能匹配成功。我们来看一个例子🌰来理解一下:

 

废话少说,放码过来

我们还需要在实战多学习,推荐一个免费学习的实战教程:https://www.python123.io/index/tutorials/regex_intro

 

当然还有本文中用于测试正则表达式的网页:https://regex101.com/  (正则101?)

还有一个有助于你理解正则表达式组成的网页:https://regexper.com/

 

还可以通过不同编程语言进行针对性练习:https://www.codewars.com/

 

当然我所讲的正则表达式的内容并没有那么全面,还以可以参考以下资料自主全面学习:

正则表达式—菜鸟教程 :https://www.runoob.com/regexp/regexp-tutorial.html

JS正则表达式完整教程 :https://juejin.im/post/5965943ff265da6c30653879

《正则表达式不要背》 :https://juejin.im/post/5cdcd42551882568651554e6

 

写在最后

    讲到这里,文章就要结束了,也感谢你认真的读到了这里,相信此时的你一定对正则表达式有了一定的了解,这也是我希望看到的,当然如果你还对正则表达式算法的实现好奇,你大可以阅读《算法导论》来刨根问底。可能目前你对正则表达式还是不太明白,没关系,你可以多读读博客或者上视频网站找教程看。或许现在你还没有用到过正则表达式,但是我相信在你反复学习过正则后,在将来的某一天,一定会看见一串奇怪的代码后恍然大悟,这就是知识积累带给你的满足感。

在此也很感谢你关注我的公众号"叶筱工作站"(CodeWorkstation),我还会不定期地更新一些可能你感兴趣的话题,如果有其他建议或想法,欢迎直接通过微信公众号聊天框给我留言,或者发邮件到:wy304379732@live.com与我联络,期待与你的交流!如果喜欢这篇文章的话,希望能够转发、点个在看,谢谢!

扫码关注我

邮箱:wy304379732@live.com

欢迎在聊天框直接留言哦!

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值