不区分大小写但保留大小写的替代函数,excel

不区分大小写但保留大小写的替代函数,excel

有没有办法做到这一点,即将 FooFOOfOO变成BarBAR、 和bAR,而不必在函数中单独输入所有可能的排列。

=SUBSTITUTE(A1,"foo","bar")区分大小写,SUBSTITUTE(lower(A1),"foo", "bar")适用于某些应用程序,但会从 A1 中删除任何现有的大小写区别;因此FoofooFOO将转到barbarbar。显然,您可以使用多个替换来捕获所有出现的情况,但有时这真的很麻烦。

非常感谢。

答案1

这是一个丑陋但实用的答案。

适用于任意两个相同长度的字符串。

我只是参加讨论,希望有人能想出更好的解决方案(也许是数组公式?)

需要辅助列。辅助列的顶行用于索引。

在此处输入图片描述

公式:

 A2      : (original string)
 C1      : blank, or 0 (needed for next column)
 C2:C... : =SUBSTITUTE(UPPER(A2),"FOO","BAR")
 D1      : =B1+1
 D2:D... : =IF(EXACT(MID($A2,C$1,1),UPPER(MID($A2,C$1,1))),MID($B2,C$1,1),LOWER(MID($B2,C$1,1)))
 B2      : concatenate (or textjoin if you're using new excel)

拖动 D 列,直到有足够多的列。目测,或使用它=max(len(A:A))来找到最大长度。

答案2

既然 Excel 支持 Lambda 函数,那么非 VBA 答案就是:

SUBSTITUTE_I = LAMBDA(Text, OldText, NewText, [InstanceNum],
    IFS(
        Text = "", "",
        OldText = "", Text,
        TRUE, LET(
            _oldLen, LEN(OldText),
            _maxInstance, INT(LEN(Text) / _oldLen),
            _pos, SCAN(0, SEQUENCE(1, _maxInstance),
                LAMBDA(_acc, _curr,
                    IF(_acc = "", "", IFERROR(SEARCH(OldText, Text, _acc + 1), ""))
                )
            ),
            _count, COUNT(_pos),
            _instance, N(InstanceNum),
            IFS(
                _count = 0, Text,
                ABS(_instance) > _count, Text,
                _instance > 0, REPLACE(Text, INDEX(_pos, 1, _instance), _oldLen, NewText),
                _instance < 0, REPLACE(Text, INDEX(_pos, 1, _count + _instance + 1), _oldLen, NewText),
                TRUE, LET(
                    _lenDiff, LEN(NewText) - _oldLen,
                    _nPos, TAKE(_pos, 1, _count) + SEQUENCE(1, _count, 0, _lenDiff),
                    REDUCE(Text, _nPos,
                        LAMBDA(_acc, _curr,
                            REPLACE(_acc, _curr, _oldLen, NewText)
                        )
                    )
                )
            )
        )
    )
);

相关内容