如何在一个字符串中,取出两个相同字符之间的内容?
场景描述
主要是用在各类编号或URL等长字符串中,取出中间的关键值。
例如在类似于编号“20201212-GEESTA-0001”中,取出中间的SKU信息;或者在数组【PS:特别是轻流,表格里面的字段在后端数据库中的存储全部都是数组】中,两个“,”,之间的数据;或者制造业中的物料编码,案例如图:

问题剖析
其实问题的核心点在于,在两个一样的字符之间,取出中间的值。
首先应该想到需要用MID函数,MID函数需要3个参数,MID(字段,取值开始的位置,取值的位数)。

所以,我们需要先找到两个“一样的字符”在什么位置。例如,上文中提到的“20201212-GEESTA-0001”,我们需要知道两个“-”在什么位置,然后再通过MID函数将“-”中间的“GEESTA”取出来。
在一个字符串中,找到指定字符串的位置,我们应该想到SEARCH函数。SEARCH需要3个参数,SEARCH(你要找的字符串,原字符串,从第几个字符开始找)。

例如,我们要在“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(目标字符串/字段,要替换的字符串的位置,要替换几个字符串,替换成什么样的字符串)。

例如,我们要把“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


效果如图:

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



效果如图:

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

案例三
取地址中的“省市区”

第一个逗号,位置
=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)