效率翻倍! 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),"\(.*\)")
- \:表示转义符。
- \(:将左括号转换为真正的标点符号左括号
- \):将右括号转换为真正的标点符号右括号
- .*:表示0个或多个连续的字符。
- \(.*\):表示括号及括号里的任意内容。
理论上运用上述正则表达式,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表格的朋友可以不用定义名称,直接在工作表中输入公式即可。