如何在Excel/谷歌表格中区分大小写识别两字符串的相同字符
假设单元格A1内容为ABC,B1内容为XaA,需要区分大小写提取两者共有的字符(即A)。之前尝试的公式无效:
尝试的无效公式:
=INDEX(FLATTEN(FILTER(FLATTEN(FILTER(REGEXEXTRACT(TO_TEXT(E1),REPT("(.)", LEN(E1))),REGEXEXTRACT(TO_TEXT(E1), REPT("(.)", LEN(E1)))<>"")),FLATTEN(FILTER(REGEXEXTRACT(TO_TEXT(E1), REPT("(.)", LEN(E1))),REGEXEXTRACT(TO_TEXT(E1), REPT("(.)", LEN(E1)))<>""))<>"")&""&TRANSPOSE(FILTER(FLATTEN(FILTER(REGEXEXTRACT(TO_TEXT(E2), REPT("(.)", LEN(E2))),REGEXEXTRACT(TO_TEXT(E2), REPT("(.)", LEN(E2)))<>"")), FLATTEN(FILTER(REGEXEXTRACT(TO_TEXT(E2), REPT("(.)", LEN(E2))),REGEXEXTRACT(TO_TEXT(E2), REPT("(.)", LEN(E2)))<>""))<>""))))
以下是可用的Excel和谷歌表格实现方法:
一、谷歌表格方案
方案1:拆分+大小写匹配+去重拼接
直接用这个公式,会返回所有共有的区分大小写字符(自动去重):
=TEXTJOIN("",TRUE,UNIQUE(FILTER(FLATTEN(REGEXEXTRACT(TO_TEXT(A1),REPT("(.)",LEN(A1)))),REGEXMATCH(TO_TEXT(B1),".*"&FLATTEN(REGEXEXTRACT(TO_TEXT(A1),REPT("(.)",LEN(A1))))&".*",0)))
- 逻辑:先把A1拆成单个字符,再用
REGEXMATCH的第三个参数0开启区分大小写模式,逐个检查字符是否在B1里,最后过滤、去重、拼接成字符串。
方案2:用BYROW简化遍历逻辑
公式更简洁,效果一致:
=TEXTJOIN("",TRUE,UNIQUE(BYROW(FLATTEN(REGEXEXTRACT(A1,REPT("(.)",LEN(A1)))),LAMBDA(x,IF(REGEXMATCH(B1,x,0),x,"")))))
- 逻辑:遍历A1拆分后的每个字符,判断是否在B1中(区分大小写),保留匹配的字符后去重拼接。
二、Excel方案
Excel默认函数大多不区分大小写,需用EXACT这个大小写敏感的函数实现:
方案1:动态数组公式(Excel 365/2021适用)
直接输入即可,无需按组合键:
=TEXTJOIN("",TRUE,UNIQUE(FILTER(MID(A1,SEQUENCE(LEN(A1)),1),BYROW(MID(A1,SEQUENCE(LEN(A1)),1),LAMBDA(x,SUMPRODUCT(--EXACT(MID(B1,SEQUENCE(LEN(B1)),1),x))>0)))))
- 逻辑:把A1拆成单个字符数组,遍历每个字符,用
EXACT对比B1的每个字符,统计匹配次数,只要大于0就保留该字符,最后去重拼接。
方案2:传统数组公式(旧版Excel适用)
输入后按Ctrl+Shift+Enter确认:
=TEXTJOIN("",TRUE,UNIQUE(IF(MMULT(--EXACT(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1),TRANSPOSE(MID(B1,ROW(INDIRECT("1:"&LEN(B1))),1))),ROW(INDIRECT("1:"&LEN(B1)))^0)>0,MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1),"")))
- 逻辑:生成A1和B1字符的大小写匹配矩阵,用
MMULT计算每个字符的匹配次数,筛选出有匹配的字符后去重拼接。
内容的提问来源于stack exchange,提问作者Charles

