结合正则函数,交流一下动态数组扩展技巧

E精精
E精精

WPS函数专家

我们通过一个网友的实战案例来一起交流学习一下,动态数组的扩展技巧,顺带学习一下新的正则函数!

▍需求说明

需求比较简单,,前面的数字是学生的序号,后面是这批学生对应的积分,但是由于填写的不规范,实际比较乱(模拟的最乱情况),现在想整理成一维表,一列学号,一列积分,具体看示意结果!

解决这个问题,我们最主要的是提取数字,这部分通过正则函数来完成,不难,但是两列对齐,也就是积分也要按学号个数扩展,写法就比较多了,也是我们本次的核心!

▍核心要点

①要点01-正则匹配数字

第一个要点是提取数字,这个简单的正则即可完成,记住\d表示0-9中的任意一个数字即可!\d+表示匹配1位或者对位数字

下面是WPS中的写法,A1单元格举例,提取的就是全部数字!

=REGEXP(A1,"\d+")

②要点02-数组对齐

如果有一列数字,我们有一个元素想扩展成对应的行数,与其对齐,大部分同学,可能或想到下面的写法

结合上面的案例,我们看一下实战用法!

=LET(S,TOCOL(REGEXP(A1,"\d+")),F,@TAKE(S,-1),HSTACK(DROP(S,-1),EXPAND(F,ROWS(S)-1,,F)))

上面的写法是OK的,但是有点冗长,如果你有数组思路,Excel中有很多数字对齐的写法,下面推荐一种小编常用的!

=LET(S,TOCOL(REGEXP(A1,"\d+")),F,@TAKE(S,-1),IF({1,0},DROP(S,-1),F))

很显然上面的写法精简了不少,下面我们看一下核心部分,IF结构!

=IF({1,0},"A",{1;2;3})

{1;2;3} 是一列三行的常量数组,{1,0} 部分可以理解为{TRUE,FALSE},0 为FALSE,非0为TRUE,这函数处理时,用大括号括起来,表示结果是一个两列的数组,如果其中一个元素是单值会自动对齐填充。如果是多值会#NA填充对齐!这就是核心要点!

当然解决上面的问题,还有很多写法,比如使用WPS的REPTARRAY函数处理,但是还是没有上面的数组思维简洁

除了这些,其实还有很多处理套路,比如容错写法

=LET(S,TOCOL(REGEXP(A1,"\d+")),F,@TAKE(S,-1),IFNA(HSTACK(DROP(S,-1),F),F))

上面的思路:让一个元素和一列内容左右拼接数组,肯定对不齐,确实的部分就会返回#NA错误,使用IFNA函数容错处理,再填充上单值即可!

上面的核心要点讲了,下面我们把这个题写一下吧!

▍参考写法

A1和A2单元格处理逻辑一样,上面我们已经解决了A1单元格,所以我们只要把逻辑使用LAMBDA函数做成一个自定义函数,然后调用即可,比如下面f就是自定义函数的名称,只有一个参数,就是对应的单元格,f(A1)表示调用A1单元格执行逻辑!结果OK!

那么多个单元格,只要使用REDUCE函数,执行后,每次的结果上下堆一下即可!核心是公式中的红色部分,也就是循环处理!

=LET(f,LAMBDA(_t,LET(S,TOCOL(REGEXP(_t,"\d+")),F,@TAKE(S,-1),IF({1,0},DROP(S,-1),F))),REDUCE({"学号","积分"},A1:A2,LAMBDA(x,y,VSTACK(x,f(y)))))

OK!以上就是本次的内容,希望大家都有自己的收获~

动态数组好用且推荐
使用过,非常推荐
3 (75%)
没用过,只会基础函数
1 (25%)
4人参与 投票已截止
江苏省
浏览 278
4
7
分享
7 +1
7
4 +1
全部评论 7
 
浅梦星河
都是高手!大佬!大表哥大表姐~~
· 吉林省
回复
 
1231393578237
学习
· 四川省
回复
 
清华学弟任泽岩
清华学弟任泽岩

创作者俱乐部成员

打卡学习!
· 广东省
回复
 
亂雲飛渡
学习
· 广东省
1
回复
 
赵二
学习
· 辽宁省
1
回复
 
千叶
EXPAND本来就有扩展, 大大为什么要多写一次拼接? LET(e,TOCOL(REGEXP(A1,"\d+",3)),DROP(EXPAND(e,,2,@TAKE(e,-1)),-1))
· 江西省
2
回复
E精精
E精精

WPS函数专家

单位为了方便讲解思路,直接扩展 去掉最后一行完全可以的~
· 江苏省
回复