如何在Excel中不用VBA/RegExp编写公式提取单元格内连续n位数字
Excel提取单元格内连续n位数字公式方案
前提说明
- 待处理文本存放位置:
A1 - 可灵活调整的提取位数参数存放位置:
B1 - 所有方案均不使用VBA、正则,修改
B1的数值即可自动调整提取的数字长度,无需修改公式结构
Excel 365/2021及以上版本方案
提取首次出现的连续n位数字
公式:
=LET( len_total, LEN(A1), pos_list, SEQUENCE(len_total - B1 + 1), check_result, ISNUMBER(--MID(A1, pos_list, B1)), first_match_pos, XMATCH(TRUE, check_result), IFERROR(MID(A1, first_match_pos, B1), "无匹配结果") )
提取所有符合条件的连续n位数字(自动溢出显示)
公式:
=FILTER(MID(A1, SEQUENCE(LEN(A1)-B1+1), B1), ISNUMBER(--MID(A1, SEQUENCE(LEN(A1)-B1+1), B1)), "无匹配结果")
如果需要把所有结果合并为顿号分隔的文本,使用:
=TEXTJOIN("、", TRUE, FILTER(MID(A1, SEQUENCE(LEN(A1)-B1+1), B1), ISNUMBER(--MID(A1, SEQUENCE(LEN(A1)-B1+1), B1)), "无匹配结果"))
Excel 2019及更早版本方案(仅支持提取首次匹配结果)
公式:
=IFERROR(MID(A1,AGGREGATE(15,6,ROW(INDIRECT("1:"&LEN(A1)-B1+1))/ISNUMBER(--MID(A1,ROW(INDIRECT("1:"&LEN(A1)-B1+1)),B1)),1),B1),"无匹配结果")
注意:旧版Excel输入公式后需要按
Ctrl+Shift+Enter组合键触发数组计算才能正常返回结果。
效果验证
以你给出的示例文本为例:
待处理文本:
abc1234_123456789012abc_87654321000_abc
提取位数B1=8
首次匹配返回结果为12345678,全匹配返回结果包含12345678、23456789、34567890、45678901、56789012、87654321、76543210、65432100、54321000,与正则\d{8}的匹配逻辑完全一致。
补充说明
如果需要提取超过15位的连续数字(比如18位身份证号),因为Excel数字精度限制,原有判断逻辑会失效,将公式中ISNUMBER(--MID(xxx))替换为以下判断条件即可:
SUMPRODUCT(--ISNUMBER(--MID(MID(A1, pos_list, B1), ROW(INDIRECT("1:"&B1)), 1)))=B1
内容的提问来源于stack exchange,提问作者Atex
相关产品推荐
相关产品推荐

