【玩转正则表达式】一套万能的针对所有场景都适用的写出正则表达式的步骤

正则表达式作为一个强力的文本模式匹配工具,在功能强大的另一面是不低的使用门槛。对于很多开发者或者使用者来说,最大的问题就是面对一串待匹配的字符串,不知道如何正确的写出正则表达式。 

我因为是公司正则表达式相关功能的开发者,所以用户使用正则相关的功能时经常都会来找我问一个问题:我有一个xxx的字符串,想提取某某元素,应该怎么写正则表达式。于是在这个过程中,我不光积累了对正则表达式语法的熟练程度,更是对如何流程化的生产出正则表达式有了自己的见解,于是在这里把整个公式化的流程总结一下,希望能帮到各位需要与正则表达式打交道的同学。

我的流程其实跟机器理解编程语言的步骤一样:

  1. 用准确的文字描述出诉求

  2. 将明确的诉求用基本的语法写出正则表达式

那什么是明确的诉求呢,举个例子

某天有个同事来问我,他们有个场景是每天某项业务都会在电脑上的某个目录产生千万级别的数据量,然后现在需要对这写数据进行一些规整,具体来说就是数据存储的相对路径是固定的,需要从这些固定的路径中提取出一些信息,来关联到这个文件上,举个实例就是某个文件的相对路径是"质量检测/产线1/20240811/NG/xxxxx.jpg",其中

  • 第一级目录“质量检测”是固定的

  • 第二级目录“产线1”代表产线编号,还可能是“产线2”,“产线3”,“产线12”等

  • 第三级目录是产生数据的时间,格式是yyyyMMDD,比如20240811,20240203,20241213等

  • 第四级目录是质量检测的结果,只有两种值,NG代表检测不通过,OK代表检测通过

  • 第五级是文件名,文件名后缀固定是.jpg,文件名内容有各种可能,无固定模式

需求就是3点:

  • 提取出产线名称,例如“产线1”

  • 分别提取出年月日,除了便于按日查找外,更便于按月或者按年查找,例如20240811需要被分别提取成2024、08和11

  • 提取出检测结果,也就是NG或者OK

大多数同学到这一步就开始考虑怎么写正则了,但是其实到这一步还不够,因为这里提到的需求还只是业务的需求,我们需要进一步把这个需求“翻译”成正则的需求,这一步是打通“需求”和“正则表达式”的关键一步。

还是以"质量检测/产线1/20240811/NG/xxxxx.jpg"为例,我们再把上面的需求翻译一遍:

  • 提取出第一个斜线‘/’到第二个斜线'/'之间的内容

  • 提取出第二个‘/’到第三个‘/’之间的内容,再把提取出的内容按4个数字、2个数字、2个数字拆分

  • 提取出第三个‘/’到第四个‘/’之间的内容

到这一步为止,正则需求分析这一步就算完成了,接下来我们再看按照正则语法来说,这几步应该分别怎么完成

  • 提取出第一个斜线‘/’到第二个斜线'/'之间的内容:也就是要能识别出一个字符串中的第一个'/'和第二个'/':

【玩转正则表达式】一套万能的针对所有场景都适用的写出正则表达式的步骤_第1张图片

  • 提取出第二个‘/’到第三个‘/’之间的内容,再把提取出的内容按4个数字、2个数字、2个数字拆分:识别出一个字符串中的第二个'/'和第三个'/',并按4个数字、2个数字、2个数字组合:

【玩转正则表达式】一套万能的针对所有场景都适用的写出正则表达式的步骤_第2张图片

  • 提取出第三个‘/’到第四个‘/’之间的内容:识别出一个字符串中的第3个'/'和第4个'/'之间的两个字母

【玩转正则表达式】一套万能的针对所有场景都适用的写出正则表达式的步骤_第3张图片

可以看到,到此为止,我们已经按照需要的内容把正则表达式写出来,也能正确的从原始字符串中提取出数据了,是不是比直接开始写要简单那么一些了?

总结一下,其实写正则和写其它代码一样,需要在业务需求的基础上做一次需求分解,得出对于正则表达式来说真正的需求,再根据真正的需求来写正则表达式,相信就能很好的应对平时遇到的绝大部分正则表达式的场景了。

大家有什么不太知道怎么写正则表达式的疑惑,可以在评论区提出来,看我能不能帮大家出出主意。

你可能感兴趣的:(玩转正则表达式,正则表达式)