跳到主要内容

如何在一个字符串中,取出两个相同字符之间的内容?

场景描述

主要是用在各类编号或URL等长字符串中,取出中间的关键值。

例如在类似于编号“20201212-GEESTA-0001”中,取出中间的SKU信息;或者在数组【PS:特别是轻流,表格里面的字段在后端数据库中的存储全部都是数组】中,两个“,”,之间的数据;或者制造业中的物料编码,案例如图:

image.png

问题剖析

其实问题的核心点在于,在两个一样的字符之间,取出中间的值。

首先应该想到需要用MID函数,MID函数需要3个参数,MID(字段,取值开始的位置,取值的位数)。

image.png

所以,我们需要先找到两个“一样的字符”在什么位置。例如,上文中提到的“20201212-GEESTA-0001”,我们需要知道两个“-”在什么位置,然后再通过MID函数将“-”中间的“GEESTA”取出来。

在一个字符串中,找到指定字符串的位置,我们应该想到SEARCH函数。SEARCH需要3个参数,SEARCH(你要找的字符串,原字符串,从第几个字符开始找)。

image.png

例如,我们要在“20201212-GEESTA-0001”中,找“-”,就需要输入

SEARCH(

"-"/*我们要找的这个字符串*/,

"20201212-GEESTA-0001"/*从这个个字符串里面找*/**,

1*/*从第1个字符开始找*/*

)

去掉里面的注释,就是

SEARCH("-","**20201212-GEESTA-0001",1)

然后,SEARCH函数就会返回“-”的位置,因为我们取的值里不能含“-”,所以这个位置+1,就是我们要用的第一个位置了。

这样的话,我们MID函数中,第二个参数就有了。

接下来是第三个参数,找第三个参数有两个办法。

SEARCH嵌套

通过上面的介绍,我们能知道SEARCH函数的特性,我们找第二个“-”的时候,前两个参数和找第一个的时候一样,我们只需要调整第三个参数就好了。

我们找第一个“-”的时候,是从第1个位置开始找的。

那找第二个“-”的时候,最好是,从第一个“-”的位置+1,开始找。

公式大概是这样

SEARCH(**"-","**20201212-GEESTA-0001",NUM(SEARCH("-","20201212-GEESTA-0001",1))+1)

REPLACE替换

介绍这个方法之前,我们先介绍一下这个REPLACE函数。REPLACE函数的作用主要是把一个字符串中指定位置的一个字符,转换成另外的指定字符。例如,我们可以把日期“2020-12-12”换成“2020/12/12”。

REPLACE函数需要4个参数,REPLACE(目标字符串/字段,要替换的字符串的位置,要替换几个字符串,替换成什么样的字符串)。

image.png

例如,我们要把“111222333”中的“111”全部换成“一一一”。

公式解释就是

REPLACE(

"111222333"/*目标字符串*/,

1*/*从第1个字符开始换*/**,*

3*/*换3个,把第1、第2、第3个字符都换了*/**,*

"一"**/*换成“一”这个字符*/

)

去掉里面的注释,就是

REPLACE("111222333",1,3,"一")

那么回到我们的问题,我们需要找到“20201212-GEESTA-0001”中第二个“-”的位置,因为SEARCH只会返回找到的第一个“-”的位置,那我们如果想找到第二个“-”的位置的话,就必须把第一个“-”给干掉。

这里就需要用到我们的REPLACE函数,我们通过SEARCH能找到第一个“-”的位置,然后我们用REPLACE把这个“-”给换掉,再用一次SEARCH,就可以找到第二个“-”的位置了。

用公式大概是这个样子的

SEARCH(

"-"/*我们要找的这个字符串*/,

REPLACE(

“20201212-GEESTA-0001”/*换这个字符串里的字符*/,

SEARCH("-","20201212-GEESTA-0001",1)/*从这个位置开始换*/,

1*/*换1个就行*/**,*

"X"**/*把“-”换成“X”,一定只能写1个字符,因为多了会改变原来的第二个“-”的位置*/

)/*从这个字符串里找*/,

1*/*从第1个字符开始找,因为第一个“-”已经被我们换掉了,所以从第一个开始找就可以了*/*

)

去掉里面的注释,就是

SEARCH("-",REPLACE(“20201212-GEESTA-0001”,SEARCH("-","20201212-GEESTA-0001",1),1,"X")**,1)

综上所述,我们获得了第一个“-”的位置和第二个“-”的位置,我们写一个MID(“20201212-GEESTA-0001”,第一个“-”的位置,NUM(第二个“-”的位置)-NUM(第一个“-”的位置)-1)就可以了。

整理一下公式,就是

1.SEARCH嵌套

*MID(“20201212-**GEESTA-0001”,NUM(*SEARCH("-","20201212-GEESTA-0001",1))+1,NUM(SEARCH("-","20201212-GEESTA-0001",NUM(SEARCH("-","20201212-GEESTA-0001",1))+1))-NUM(SEARCH("-","20201212-GEESTA-0001",1))-1)

2.REPLACE替换

*MID(“20201212-**GEESTA-0001”,NUM(**SEARCH("-","20201212-GEESTA-0001",1))+1,NUM(SEARCH("-",REPLACE(“20201212-GEESTA-0001”,SEARCH("-","20201212-GEESTA-0001",1),1,"X"),1))-NUM(*SEARCH("-","20201212-GEESTA-0001",1))-1)

解决方案

案例一

在“20201212-GEESTA-0001”获取GEESTA

image.png

image.png

效果如图:

image.png

案例二

在“123A45A67A89A”去前两个A中间的值,也就是“45”

image.png

image.png

image.png

效果如图:

image.png

甚至我们可以随便更改两个A里面的值

image.png

案例三

取地址中的“省市区”

image.png

第一个逗号,位置

=SEARCH(查询内容,查询范围,查询起始位置)

=SEARCH(",",地址)

第二个逗号,位置

=SEARCH(查询内容,查询范围,查询起始位置)

=SEARCH(",",地址,第一个逗号位置+1)

=SEARCH(",",地址,SEARCH(",",地址)+1)

第三个逗号,位置

=SEARCH(查询内容,查询范围,查询起始位置)

=SEARCH(",",地址,第二个逗号位置+1)

=SEARCH(",",地址,SEARCH(",",地址,SEARCH(",",地址)+1)+1)

省/地区

=LEFT(取值范围,取值字符个数)

=LEFT(地址,第一个逗号位置-1)

=LEFT(地址,SEARCH(",",地址)-1)

=MID(取值范围, 开始位置, 取值字符个数)

=MID(地址, 第一个逗号位置+1, 第二个逗号位置-第一个逗号位置-1))

=MID(地址,SEARCH(",",地址)+1,(SEARCH(",",地址,(SEARCH(",",地址)+1))-SEARCH(",",地址)-1))

区/县

=MID(取值范围, 开始位置, 取值字符个数)

=MID(地址, 第二个逗号位置+1, 第三个逗号位置-第二个逗号位置-1))

=MID(地址,SEARCH(",",地址,SEARCH(",",地址)+1)+1,SEARCH(",",地址,SEARCH(",",地址,SEARCH(",",地址)+1)+1)-SEARCH(",",地址,SEARCH(",",地址)+1)-1)