金山WPS

关注公众号 jb51net

关闭
软件教程 > 办公软件 > 金山WPS >

效率翻倍! wps中regexp+asc+evaluate公式快速结算杂乱内容数据的技巧

脚本之家

网友求助SOS:如何将含杂乱内容的计算过程记录,快速计算出结果?由于这位网友的要求比较特殊,我们简化数据源,用案例进行讲解。

如下图所示:

A2单元格是计算过程的记录:8.7(长)*3.6(宽)-6.1(长)*2(宽)+2,不仅含有原始的文本核心算式:8.7*3.6-6.1*2+2,并且在数字后面还标注了带括号的长或宽的信息。并且括号格式还不一致,有些是中文全角的,有些是英文半角的,这些特殊处理细节都对B2单元格的计算结果增加了难度。

A2单元格的理论计算过程与结果是,我们想要得到的就是B2的结果:

=8.7*3.6-6.1*2+2

=21.12

下面拆解公式,分步骤讲解作用原理。

第一步:统一括号格式

我们输入公式:

=ASC(A2)

全角的1个左/右括号占2个字符的长度,半角的1个左/右括号占1个字符的长度,这个特点我们用肉眼可以观察到。

ASC函数可以将全角字符转换为半角字符。所以全角的左/右括号就转换为了半角的左/右括号。

统一格式后的效果:

"8.7(长)*3.6(宽)-6.1(长)*2(宽)+2"

第二步:删除括号及括号的内容

我们外面嵌套REGEXP正则表达式函数:

=REGEXP(ASC(A2),"\(.*\)")

理论上运用上述正则表达式,REGEXP函数用默认的“提取”模式,可以提取到A2单元格中所有的括号及括号里的任意内容。

但是却出现了下面错误的结果:

(长)*3.6(宽)-6.1(长)*2(宽)

原因REGEXP正则表达式函数默认的是“贪婪模式”,它会尽可能多的匹配内容,它会将:“8.7(长)*3.6(宽)-6.1(长)*2(宽)+2”原始数据中,第一个左括号与最后一个右括号中间的内容全部提取出来:“(长)*3.6(宽)-6.1(长)*2(宽)”

所以我们需要完善正则表达式:

=REGEXP(ASC(A2),"\(.*?\)")

在*后面加上一个?号,?是“贪婪模式”向“懒惰模式”转换的开关,这样转换为懒惰模式后,它会尽可能少的匹配括号里面的内容,只会分别匹配单独的每个括号及括号里面的内容。

最后提取结果以数组溢出的方式显示在一行多个单元格中:

{"(长)","(宽)","(长)","(宽)"}

继续完善正则公式:

=REGEXP(ASC(A2),"\(.*?\)",2,)

=REGEXP(ASC(A2),"\(.*?\)",2,"")

将第三参数由默认的省略或0修改为2,表示“替换”模式,第4参数表示替换为什么,我们跳过或设置为"",表示替换为空值。

即将查找出来的4组括号及括号里面的内容,替换为空,等价于删除4组括号及括号里面的内容。

第三步:计算文本算式

最外面嵌套EVALUATE函数:

=EVALUATE(REGEXP(ASC(A2),"\(.*?\)",2,))

EVALUATE函数是常用的宏表函数之一,用于对以文字表示的一个公式或表达式求值,并返回结果。

该函数不能在微软Office Excel单元格中直接使用,需要使用自定义名称的方法间接调用。

使用WPS表格的朋友可以不用定义名称,直接在工作表中输入公式即可。

推荐阅读:二维转一维表又一新思路! wps中3个tocol+2个if直接搞定