分享

LAMBDA应用示例:递归替换字符

 hercules028 2023-03-23 发布于四川
本文介绍使用LAMBDA创建的替换字符的自定义函数。
示例公式如下:
=ReplaceChars(B3,'!@#$%^&*()[]<>-?.,','')
ReplaceChars函数接受3个参数,第一个参数str是要被执行字符替换的文本字符串,第二个参数chars是文本字符串中要被替换的字符,第三个参数sub是用于替换文本字符串中找到的要被替换的字符。
在下图1所示的示例中,ReplaceChars函数被设置为查找第二个参数中的标点符号(chars),并将其替换为空字符串(“”)。
图片
1
这个自定义的LAMBDA公式演示了一个称为递归的特性,即在函数中调用该函数本身。
=LAMBDA(str,chars,sub,
  IF(chars='', str,
     ReplaceChars(
     SUBSTITUTE(str,LEFT(chars),sub),
     MID(chars,2,LEN(chars)-1),
     sub
     )
   )
)
递归可以用来创建优雅、紧凑、非冗余的代码。然而,递归LAMBDA函数当前的一个缺点是它们不容易测试。因为它们不能直接在工作表上调试,因为此时的LAMBDA还没有定义名称,因此不能调用自己。
当创建递归LAMBDA公式时,一个关键考虑因素是该公式如何通过调用自身来退出它执行的循环。一种常见的方法是,每次公式调用自己时都会损耗输入参数,然后在每次调用之前检查输入是否已完全耗尽,如果是,则退出。这样,输入参数就像计数器一样,倒数到零。
这就是本文示例公式中采用的方法——chars参数就像一个计数器,每次公式调用自己时都会删除一个字符。在递归调用之前,IF函数用于检查chars是否为空。如果是,则公式返回str的当前值作为最终结果并退出。如果不是,则公式调用自身。
SUBSTITUTE函数处理用sub值替换在chars中的字符:
SUBSTITUTE(str,LEFT(chars),sub)
SUBSTITUTE函数一次仅执行一个替换,这就是为什么要使用递归的原因。参数str最初是提供给函数用于字符替换的文本字符串,但注意,每次函数调用自己时,该值都可能发生变化。要替换的字符由LEFT函数提供:
LEFT(chars)
用于替换的值来自于sub。理解这个公式的技巧是看SUBSTITUTE的结果被直接用于调用ReplaceChars函数,并且这个结果成为下一个”str参数。此外,每次调用ReplaceChars时,字符串字符都会被MID函数耗掉一个字符,MID的结果将成为调用ReplaceChars时使用的字符的下一个值。
MID(chars,2,LEN(chars)-1)
一旦字符完全耗尽(即变为空字符串),IF函数内部的逻辑测试将返回TRUE,公式将返回str的当前值作为最终结果。
自定义LAMBDA函数的行为与其他函数类似,因此可以通过嵌套轻松扩展功能。例如,可以去掉标点符号并替换为空格字符(“”),然后通过在TRIM函数中嵌套ReplaceChars来清理后面的内容,如下所示:
=TRIM(ReplaceChars(B3,'!@#$%^&*()[]<>-?.,',''))
TRIM函数将删除前导空格和尾随空格,并将单词之间的空格规范化为一个空格。这将避免当单词仅用标点符号分隔时出现组合的问题。
注:本文学习整理自exceljet.net,供有兴趣的朋友参考。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多