我见过许多在其他程序或语言中查找最长公共子字符串 (LCS) 或两个字符串之间最长共享文本的解决方案,但没有见过在 Excel 中使用公式的解决方案。在这里发布我自己的解决方案。请随意添加关于如何改进这个公式的建议——
Sarr
看起来特别“臃肿”。
TL;博士
=LET(s1_adj,SUBSTITUTE(LOWER(A1),LOWER(A3),""),s2_adj,SUBSTITUTE(LOWER(A2),LOWER(A3),""),Sarr,MID(s1_adj,SEQUENCE(LEN(s1_adj)-1),SEQUENCE(,LEN(s1_adj)-1,LEN(s1_adj),-1)),CSarr,UNIQUE(TOCOL(MAP(Sarr,LAMBDA(a,IF(ISNUMBER(FIND(a,s2_adj)),a,""))))),SSarr,FIND(CSarr,TRANSPOSE(CSarr)),SSarrPROD,BYROW(IF(CSarr=TRANSPOSE(CSarr),1,IF(ISNUMBER(SSarr),0,1)),LAMBDA(row,PRODUCT(row))),TEXTJOIN(", ",TRUE,FILTER(CSarr,SSarrPROD<>0)))
此公式不仅会返回 LCS,还会返回所有常见子字符串(前提是子字符串的长度为 2 个或更多字母)。它还支持从考虑中删除两个子字符串中的特定共同文本,以便更轻松地分析较长的字符串。
这是如何运作的:
SUBSTITUTE
区分大小写),然后删除/忽略任何指定的共同文本FIND
比较器字符串中的每个子字符串,并仅返回匹配的 UNIQUE
子字符串(可以有重复的字母字符串)。例如,如果目标字符串是“banana”,则“an”的子字符串将在数组中至少出现两次。FIND
并删除子子串(因为它们已经被本地 LCS 覆盖)。例如,目标文本“banana”的“an”包含在“anan”中。TEXTJOIN
将剩余的公共子字符串放入单个文本单元格中。