如何在电子表格中提取字符串中的所有特定子字符串?
Google Sheets 解决方案
方法1:提取所有匹配项并拆分到多列
假设待匹配的子字符串列表存放在Sheet2!A1:A30,目标字符串在A2单元格,使用以下公式:
=ARRAYFORMULA(IFERROR(SPLIT(REGEXREPLACE(A2,"\b(?!("&TEXTJOIN("|",TRUE,Sheet2!A1:A30)&"))[^\.]+(\.|$)","$1"),".",TRUE,FALSE)))
逻辑说明:
TEXTJOIN("|",TRUE,Sheet2!A1:A30):将子字符串列表拼接成正则兼容的string1|string2|...模式- 正则部分
\b(?!(匹配列表))[^\.]+(\.|$):匹配所有不在列表中的子串,将其替换为句点(或字符串结尾),最终保留的内容仅为匹配的子串和分隔句点 SPLIT(..., ".", TRUE, FALSE):按句点拆分结果,自动忽略空值,拆分到不同列
方法2:提取所有匹配项合并到单个单元格
如果不需要拆分到列,用TEXTJOIN合并结果:
=TEXTJOIN(", ", TRUE, ARRAYFORMULA(IFERROR(SPLIT(REGEXREPLACE(A2,"\b(?!("&TEXTJOIN("|",TRUE,Sheet2!A1:A30)&"))[^\.]+(\.|$)","$1"),".",TRUE,FALSE))))
简化版正则方案
如果子字符串无特殊字符,也可以用更直接的替换方式保留匹配项:
=SPLIT(REGEXREPLACE(A2,".*?\b("&TEXTJOIN("|",TRUE,Sheet2!A1:A30)&")\b|.+","$1 ")," ",TRUE,FALSE)
逻辑说明:
- 匹配每个符合条件的子串并保留,其余内容替换为空格
- 最后按空格拆分,自动过滤空值得到所有匹配项
Excel 365 / LibreOffice Calc 解决方案
合并所有匹配项到单个单元格
假设匹配列表在Sheet2!A1:A30,目标字符串在A2:
=TEXTJOIN(", ", TRUE, FILTER(Sheet2!A1:A30, ISNUMBER(SEARCH("."&Sheet2!A1:A30&".", "."&A2&"."))))
逻辑说明:
."&Sheet2!A1:A30&"."和."&A2&".":用句点包裹匹配项和目标字符串,避免部分匹配(比如防止"ABC"匹配"ABCD")ISNUMBER(SEARCH(...)):判断匹配项是否存在于目标字符串中FILTER:筛选出所有存在的匹配项,TEXTJOIN合并为字符串
拆分到多列(Excel 365)
直接用FILTER会自动溢出到右侧列:
=FILTER(Sheet2!A1:A30, ISNUMBER(SEARCH("."&Sheet2!A1:A30&".", "."&A2&".")))
核心思路
- 动态生成正则模式:通过
TEXTJOIN将外部列表转为正则的或模式,避免手动写30个字符串的正则 - 过滤非匹配内容:利用正则替换删除所有不需要的子串,仅保留目标匹配项
- 批量匹配筛选:Excel/LibreOffice通过
FILTER+SEARCH组合,直接从列表中筛选出存在于目标字符串的项,无需正则
内容的提问来源于stack exchange,提问作者kq76
相关产品推荐
相关产品推荐

