Microsoft Excel 根据同一张表中的列表在两列中搜索和替换短语

问题描述 投票:0回答:1

Sample Image
我试图找到一种方法来根据同一张纸中的引用列表搜索和替换源列中的多个单词。我见过其他线程处理非常相似的问题,唯一的区别是我希望能够使用 (*) 函数来查找和替换短语而不仅仅是单词。

根据示例,我想从 A2 中获取内容,并根据 D 和 E 列中的列表在 B2 中获得结果。

示例:

以本内容为例 - 尺寸为 1 长 x 1 宽 x 1 高英寸,重 1 磅,蓝色保护壳是您新手机的完美配件

最终只有 - 尺寸为 1L x 1W x 1H 英寸,重量为 1 磅。

基本上替换“lbs”(lbs*)后面的所有内容,并用句点替换它们来结束句子。

在实际应用中,单词因内容而异,但通常它们遵循一定的模式,所以我希望能够使用 (*) 函数。

提前致谢!

根据示例图像,B 列具有公式 =SUBSTITUTE 函数,但我再次发现它只能将一个单词更改为另一个单词。

希望能够定位遵循某种模式的一串单词或短语,并将其替换为另一个短语或单个单词。

excel excel-formula replace find substitution
1个回答
0
投票

这是一个快速草稿,也许 P.b 可以缩短它:)

我对第一个条目做了一些细微的更改:

lbs
>
lbs*

使用 Microsoft 365,

  • 末尾有通配符的通配符匹配需要最后应用,因此对列表进行排序(
    wild_index
    old_new_sorted
  • 使用
    SEARCH
    (不区分大小写,通配符匹配)查找开始和结束位置,与
    REPLACE
    一起使用;要找到结束位置,请反转字符串

如果您可以访问

REGEXREPLACE
,请告诉我。

=LET(
    src, A2:A4,
    old_new, C2:D14,
    indices, SEQUENCE(ROWS(old_new)),
    wild_index, IF(
        RIGHT(INDEX(old_new, , 1)) = "*",
        MAX(indices) + 1,
        indices
    ),
    old_new_sorted, SORTBY(old_new, wild_index),
    revStr, LAMBDA(str,
        TEXTJOIN("", 1, MID(str, SEQUENCE(LEN(str), , LEN(str), -1), 1))
    ),
    match_start, LAMBDA(find, within, SEARCH(find, within)),
    match_end, LAMBDA(find, within,
        LEN(within) - SEARCH(revStr(find), revStr(within)) + 1
    ),
    repl_wild, LAMBDA(inStr,
        REDUCE(
            inStr,
            indices,
            LAMBDA(acc, cur,
                LET(
                    start, match_start(
                        INDEX(old_new_sorted, cur, 1),
                        acc
                    ),
                    end, match_end(INDEX(old_new_sorted, cur, 1), acc),
                    IF(
                        ISNUMBER(start) * ISNUMBER(end),
                        REPLACE(
                            acc,
                            start,
                            end - start + 1,
                            INDEX(old_new_sorted, cur, 2)
                        ),
                        acc
                    )
                )
            )
        )
    ),
    VSTACK("Result", MAP(src, repl_wild))
)

Result

© www.soinside.com 2019 - 2024. All rights reserved.