饭都被正则抢了:“\”数量不等,以最后一个“\”分隔符分列
粉丝求助SOS:如何以最后一个“\”作为分列依据,进行拆分列。
如下图所示:
A列数据的特点是:每个单元格中的数字用分隔符“\”分成了若干部分。因为每个单元格分隔符“\”的数量不等,导致分段的数量也不一致。我们想要用每个单元格中的最后一个“\”,作为分列依据,进行拆分列,最终的效果就是B列与C列的结果。
在没有出现REGEXP正则表达式函数之前,我们要用一系列的函数组合成嵌套公式,进行解决。当有了REGEXP之后,可能只用几个正则符号,就可以像编程一样,瞬间解决问题。下面我们就分两种方法:公式嵌套法与正则表达式法,看看好饭都是怎么被正则抢走的。
公式嵌套法
我们由内层向外层逐步解析公式,确定分列1。
首先输入SUBSTITUTE函数:
=SUBSTITUTE(A2,"\","")
用SUBSTITUTE替换函数,将A2单元格中的所有"\",替换为空值,也就是说将A2单元格中的所有"\"删除了,留下了其他的字符。
向外嵌套一层LEN函数:
=LEN(SUBSTITUTE(A2,"\",""))
用LEN长度统计函数,将上一步SUBSTITUTE返回结果的字符的长度统计出来。
即去掉“\”后的字符长度。
继续完善公式为:
=LEN(A2)-LEN(SUBSTITUTE(A2,"\",""))
LEN(A2)可计算A2单元格字符总长度。
用A2单元格字符总长度减去[A2单元格去掉“\”后的总长度]=“\”的长度。
即得到每个单元格中“\”的总个数。
继续向外嵌套TEXTBEFORE函数:
=TEXTBEFORE(A2,"\",LEN(A2)-LEN(SUBSTITUTE(A2,"\","")))
TEXTBEFORE函数可以提取指定的字符之前的所有内容,并且还可以设置这个字符位于第几个位置。
我们以A2单元格数据为例:
用TEXTBEFORE函数提取第2个“\”(即上一步的返回结果)之前的所有内容,返回“1\6”。
继续完善上述公式:
=TEXTBEFORE(A2,"\",LEN(A2)-LEN(SUBSTITUTE(A2,"\","")))&"\"
按要求需要在上一步的返回结果的基础上对“1\6”加上一个“\”,变成“1\6\”
确定分列2
用TEXTAFTER函数:
=TEXTAFTER(A2,"\",LEN(A2)-LEN(SUBSTITUTE(A2,"\","")))
TEXTAFTER函数可以提取指定的字符之后的所有内容,并且还可以设置这个字符位于第几个位置。
我们以A2单元格数据为例:
用TEXTBEFORE函数提取第2个“\”之后的所有内容,返回“5”。
有了REGEXP正则表达式函数之后,只需要设置几个简单的正则符号,就解决啦!
正则表达式法
首先输入公式:
=REGEXP(A2,".*\\")
.:表示任意的单个字符
.*:表示连续的任意字符
\\:表示用转义符“\”将"\"转化为真正的普通符号。
.*\\:整体可以表示任意的“数字\”这种格式模式。
REGEXP默认贪婪模式,就可以将A2单元格内的“1\6\”提取出来。
继续完善正则表达式:
=REGEXP(A2,".*\\|\d+$")
|:代表逻辑“或”的意思。
\d+$:代表以任意连续的数字结尾
这样就可以将A2单元格中以数字结尾的那个数字也同时提取出来,返回“5”。