重学正则表达式(五)-- 完结篇

经过前面4章的学习,如果能做到熟练并掌握,完成工作中大多数需要使用到正则表达式的场景已经绰绰有余,但是要想更加深入的学习正则表达式,依然是任重道远!
其实,正则表达式的使用场景除了web编程常用的校验用户输入信息是否满足要求,还在很多地方都有用武之地。比如,现在很多文本编辑器都支持通过正则进行匹配文本内容或者是替换内容,常用的有notepad++editplussublime等。linux很多命令也是支持正则匹配的,比如 grepawksed等,以前的你监控日志的命令可能是这样的:tail -f xxx.log | grep 'zhangsan',如今,你的监控命令可以是这样的 tail -f xxx.log | grep -P '\d{4}-\d{2}-\d{2}\szhangsan'。当然由于各种原因,linux各个版本对正则的支持以及使用方式都有些许差别,使用时可以具体查阅。
做开发的人很多都知道,国内有一款开源的用来做对象序列化反序列化的库fastjson,这玩意我用着很顺手,但是这个库类之前好几次被曝出有安全漏洞,虽然官方及时修复了相关漏洞并发布了新版本。之前在一家公司刚好赶上了fastjson被爆出安全漏洞的时候,第一次被爆出来,项目组紧急梳理,把涉及到的项目里fastjson版本统一升级到了官方发布的修复漏洞后的版本。不久之后又遇到一次类似的情况,这次呢,公司安全团队觉得最近安全问题频发,要求我们整理项目使用到的所有第三方库类交由安全团队扫描、审核,排查潜在安全问题。这个也简单,找到项目依赖的lib目录,ls >> lib.txt,轻松搞定,so easy!,但是你如果那这样的文件去找安全团队,你看他们会不会打死你!

jsr305-3.0.2.jar
jul-to-slf4j-1.7.30.jar
lettuce-core-6.0.2.RELEASE.jar
netty-codec-4.1.59.Final.jar
spring-boot-2.4.3.jar
spring-boot-autoconfigure-2.4.3.jar
spring-boot-jarmode-layertools-2.4.3.jar
spring-context-5.3.4.jar
spring-context-support-5.3.4.jar
spring-core-5.3.4.jar
tomcat-embed-websocket-9.0.43.jar

拿着这样的文件上百份(因为涉及到的项目有100多个),而且里面有很多是重复的(使用的是同样的版本),让人家怎么下手?
于是自然而然的第一步,我们需要把这些库类文件的名字和版本切割出来,当时我尝试过使用excel来做这个工作,最终以失败告终,十多个人,没有一个有好的处理方法,最终我们通过人肉十多个人耗时大半天完成!想想要是当时对正则有现在的认知(虽然现在对正则的认知还处于无知状态),处理这个问题也不会那么的耗时耗力了。哎,说多了都是泪!
正则的学习到此就告一段落了,下面我列举一些工作中常用的正则以供查阅:

匹配正数、负数和小数
希望正则能匹配到比如 1,3.14,-2.2,+4.5 等数字,需要注的是,开头的正负符号可能有,也可能没有,所以可以使用 [-+]? 来表示,小数点和后面的内容也不一定会有,所以可以使用 (?:\.\d+)? 来表示,因此匹配正数、负数和小数的正则可以写成
[- +]?\d+(?:\.\d+)?

十六进制数
十六进制的数字除了有 0-9 之外,还会有 a-f(或 A-F) 代表 10156 个数字,所以正则可以写成
[0-9A-Fa-f]+

手机号码
手机号应该是比较常见的,手机号段比较复杂,如果要兼容所有的号段并不容易。目前来看,前四位是有一些限制,甚至 1740 和 1741 限制了前 5 位号段。我们可以简单地使用字符组和多选分支,来准确地匹配手机号段。如果只限制前 2 位,可
以表示成 1[3-9]\d{9},如果想再精确些,限制到前三位,比如使用1(?:3\d|4[5- 9]|5[0-35-9]|6[2567]|7[0-8]|8\d|9[1389])\d{8}来表示。但要注意的是,越是精确,只要有新的号段,你就得改这个正则,维护起来会比较麻烦。在实际运用的时候,你可能还要考虑一下有一些号码了 +86 或 0086 之类的前缀的情况。

身份证号码
我国的身份证号码是分两代的,第一代是 15 位,第二代是 18 位。如果是 18 位,最后一位可以是 X(或 x),两代开头都不能是 0,根据规则,你应该能很容易写出相应的正则,第一代可以用 [1-9]\d{14} 来表示,第二代比第一代多 3 位数据,可以使用量词 ? 表示 0 到 1 次。
[1-9]\d{14}(\d\d[0-9Xx])?

邮政编码
邮编一般为 6 位数字,首位不是 0,比较简单,可以写成 [1-9]\d{5},之前我们也提到过,6 位数字在其它情况下出现可能性也非常大,比如手机号的一部分,身份证号的一部分,所以如果是数据提取,一般需要添加断言,即写成
(?<!\d)[1-9]\d{5}(?!\d)

QQ 号码
QQ 号不能以 0 开头,最长的有 10 位,最短的从 10000(5 位)开始。从规则上我们可以得知,首位是 1-9,后面跟着是 4 到 9 位的数字,即可以使用 [1-9][0-9]{4,9} 来表示。

中文字符
中文属于多字节 Unicode 字符,可以根据码值的范围来匹配,中文的范围是 4E00 - 9FFF之间,这样可以覆盖日常使用大多数情况,Unicode 可以写成 \u码值 来表示,即匹配中文的正则可以写成 [\u4E00-\u9FFF]

邮箱
邮箱的组成是比较复杂的,格式是 用户名 @主机名,用户名部分通常可以有英文字母,数字,下划线,点等组成,但其中点不能在开头,也不能重复出现,一个简体的版本邮箱正则,比如:
[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+

最后介绍一个用于测试正则的工具,同时你可以利用它的debugger功能加深理解正则匹配的整个过程。正则测试工具

正则的学习到此就告一段落了,要想对正则有更深去的理解需要进一步的学习以及在工作中的灵活运用,毕竟,能学以致用才算是真正的学废了!

写在最后的话,正则虽好,可不要乱用哦!毕竟正则也不是万能的。时代在进步,技术在跑步,要想不被时代的洪流所抛弃,只能不断的学习。学习,不就是每个 programmer 与生俱来的使命吗!就此拜别!因能力有限,如文中有表达不到位或者错误的地方,欢迎大家批评指正,感谢。

系列文章如下:
重学正则表达式(一)
重学正则表达式(二)
重学正则表达式(三)
重学正则表达式(四)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不务正业的攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值