一个提高效率的工具,正则表达式,值得学习一下!
前言
之前分享过几篇工具系列的文章,受到不少读者喜欢
今天再分享一个关于提高工作效率的工具:正则表达式
在工作中一般使用正则表达式来匹配,替换,检索文本,可以大大提高了工作效率
文章首发在公众号(月伴飞鱼),之后同步到掘金和个人网站:xiaoflyfish.cn/
觉得有收获,希望帮忙点赞,转发下哈,谢谢,谢谢
简介
正则表达式,又称规则表达式,通常被用来检索、替换那些符合某个模式(规则)的文本。
许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。
学会使用正则表达式可以极大提高我们文本处理效率,并且各大操作系统、编程语言、文本编辑器都已经支持正则表达式
在线正则测试工具:https://regex101.com/r/PnzZ4k/1
下面的例子我会使用Sublime Text(对了,这个工具也非常好用)实现
元字符
一般普通字符表示的还是原来的意思,比如字符 e
举例:
![](https://filescdn.proginn.com/ff5b6e18ab509aeda64742e29e2999d6/d01b2ea0076e1b972fd5e278af90cbda.webp)
所谓元字符(Metacharacter)就是指那些在正则表达式中具有特殊意义的专用字符
![](https://filescdn.proginn.com/f459f594e77fdc6eb74ff7341cc512a6/89813e8539d2964f791050ec5fdb0afd.webp)
特殊单字符
![](https://filescdn.proginn.com/9d249485cb7efed945bdaa1a7c840db0/ba8de7a73f63b84519ccd4f0c10ca2d9.webp)
举例1:
![](https://filescdn.proginn.com/6504dcd895b85c317bbdc692b915c562/a66780b8d7f82a228f4b5a347b8691f4.webp)
举例2:
![](https://filescdn.proginn.com/f3f7c0e03ec0118bfbcdc18c2cf8ff9b/b9162f9c72ee2bbebdf562c429ea709b.webp)
空白符
![](https://filescdn.proginn.com/5de913622609a21932a8d7f9968ee30e/1e98c9144a4ece7d246eb50ab85fdfc2.webp)
举例:
s 能匹配上各种空白符号,也可以匹配上空格
![](https://filescdn.proginn.com/173bf9cf8a80048e223fba2a80276358/f16df66f5e14393a922c9e5ac14cfad0.webp)
量词
![](https://filescdn.proginn.com/05a1fa969eda3fec9abfcee072e097d1/30201773bc13a8adf6ef96952616cbc0.webp)
举例1:
![](https://filescdn.proginn.com/fd6698eeec09e2e4fdd175979617d83e/233d2e9440ee348a3b8b06252300b8a0.webp)
举例2:
![](https://filescdn.proginn.com/3792a7747e81fab7ca1a61fe9abad747/766d6cf36f54a8e4e3b37baf977c5cda.webp)
范围
![](https://filescdn.proginn.com/e8c63655274975bdbc3a418c91bd16b1/fbefa205a1c0e4892cf7cff144579126.webp)
举例:
![](https://filescdn.proginn.com/6b0fc7cd5c509eef032fa7cfc99e4cf6/1db1202832de7b1c37a2bea143f5bbab.webp)
贪婪、非贪婪与独占
正则有三种模式:贪婪匹配、非贪婪匹配和独占模式
-
贪婪匹配:在正则中,表示次数的量词默认是贪婪的,在贪婪模式下,会尝试尽可能最大长度去匹配。
-
非贪婪匹配:找出长度最小且满足要求的,量词后面要加上英文的问号(
?
),正则就变成了a*?
。
举个例子1:
![](https://filescdn.proginn.com/f061cec59fc026117604442bed151198/ad3939f0a6d9ce35bc78a3e2475d418f.webp)
匹配结果是:"aaa",""
为什么会匹配到空字符串?
因为星号(*)代表0到多次。
举个例子2:
![](https://filescdn.proginn.com/be61d3914ab8e92a6ed2cfe68baf6df0/b91e3965076bcbdf3f953d1708cbc442.webp)
![](https://filescdn.proginn.com/1243552314d2b687defa14f542eadada/da17e5e8ef4678b33055435bbdcd53d9.webp)
独占模式:
不管是贪婪模式,还是非贪婪模式,都需要发生回溯才能完成相应的功能。
但是在一些场景下,我们不需要回溯,匹配不上返回失败就好了,因此正则中还有另外一种模式,独占模式,它类似贪婪匹配,但匹配过程不会发生回溯,因此在一些场合下性能会更好。
什么是回溯?
例如下面的正则:
regex = “xy{1,3}z”
text = “xyyz”
在匹配时,y{1,3}会尽可能长地去匹配,当匹配完 xyy 后,由于 y 要尽可能匹配最长,即三个,但字符串中后面是个 z 就会导致匹配不上,这时候正则就会向前回溯,吐出当前字符 z,接着用正则中的 z 去匹配
![](https://filescdn.proginn.com/2fde4193d841d3952fd132d8a2eee342/9bc2b7f56c900d6de9e7a0a50af935ca.webp)
分组与引用
举个例子:
假设我们现在要去查找15位或18位数字。
根据前面学习的知识,使用量词可以表示出现次数,使用管道符号可以表示多个选择,你应该很快就能写出d15}。
但经过测试,你会发现,这个正则并不能很好地完成任务,因为18位数字也会匹配上前15位
![](https://filescdn.proginn.com/1c6ecc10c78673bf8c022a000a787100/0d69c42bf1a9081abd2671600d47613c.webp)
没有匹配到18位的记录
解决方式
可以用括号括起来表示一个整体
![](https://filescdn.proginn.com/0b088a423e5b17a9803462bfcaf99014/f380ade3f63e560747c1755eaac98852.webp)
替换举例
![](https://filescdn.proginn.com/17576e1f248e9cfab83a086610f7e3f0/8bae775050bc1efcc9a0b813b24b897a.webp)
替换后:
![](https://filescdn.proginn.com/caf5ae97efc77c02586b79255957a784/fd35161db2c281e44998ceb74400ef93.webp)
匹配模式
常见的匹配模式有4种,分别是不区分大小写模式、点号通配模式、多行模式和注释模式
不区分大小写模式
![](https://filescdn.proginn.com/7bb38bf2115648c57fd05139def601bb/486ca241a7d93f7300c978cd6f7db2c9.webp)
**使用模式修饰符:**放在整个正则前面时,表示匹配模式
![](https://filescdn.proginn.com/da82c5443188c6e1340850f59485d5eb/fb7927e49d005ca56a8fedd0760f5cb4.webp)
点号通配模式
点号它可以匹配上任何符号,但不能匹配换行,如何匹配真正的“任意”符号
![](https://filescdn.proginn.com/150797a3c65a1fa95fc0a8d556880ea2/b8b301e07f6dcfd97f50e2b04bf054b6.webp)
多行匹配模式
多行模式的作用在于,使 ^ 和 $ 能匹配上每行的开头或结尾,我们可以使用模式修饰符号 (?m) 来指定这个模式
![](https://filescdn.proginn.com/73f19a6788ffe63eb6c0a87a725a604e/f1b483bfdb320680ef2452159232cf11.webp)
注释模式
为正则添加注释
![](https://filescdn.proginn.com/970227f11d9af8bfbb9751fcea85fa13/cde2b6cf02aca15e70c9d62e974a516f.webp)
断言
断言是指对匹配到的文本位置有要求。
通过一些例子来讲解。
你应该知道 d{11} 能匹配上11位数字,但这11位数字可能是18位身份证号中的一部分。再比如,去查找一个单词,我们要查找 tom,但其它的单词,比如 tomorrow 中也包含了tom
![](https://filescdn.proginn.com/b084aeab34e322f80f71ca416cf585a7/7120f4c0572df7b29d82deb995839d24.webp)
单词边界
![](https://filescdn.proginn.com/d6ee4fb20f833319cb80d266cc2fcdee/0e9627c35187a54e537cd7e43a81ed2d.webp)
环视
举例邮政编码的判断:6位数字,且左边不是数字,右边不是数字
![](https://filescdn.proginn.com/613c0222fe5e75b4ddd227c5bd03890c/3a0ca328c8ca591b10006ef976154e03.webp)
最后
觉得有收获,希望帮忙点赞,转发下哈,谢谢,谢谢
微信搜索:月伴飞鱼,交个朋友,进面试交流群
公众号后台回复666,可以获得免费电子书籍
参考资料:
-
极客时间:正则表达式入门课
![](https://filescdn.proginn.com/83ec5b5d9011ede9dd0e2b54610f6edf/555d66732fc238cc846aa6880c80a4c0.webp)
面试题:在日常工作中怎么做MySQL优化的?
![](https://filescdn.proginn.com/66599298fa06a5da05b59764285769a5/89cf2674c7a9b366f6e8992cef48c7fc.webp)
来自读者的面试题:谈谈Spring用到了哪些设计模式?
![](https://filescdn.proginn.com/5ab08adb8bde42da7c96dec9f22852e2/38a7e6b6dbd46e5133fbdb3b3eb5a06c.webp)