wps用户用=regexp(a1,"1[3-9]\d{9}")一键提取首个手机号;excel用户可用数组公式=lookup(9e+307,--mid(a1&"a",row($1:$99),11))暴力遍历;大批量数据推荐power query三重校验;高频处理可部署vba自定义getmobile函数。

你需要从Excel里成百上千行混着地址、姓名、备注的杂乱文本中,准确揪出所有11位手机号,不漏提、不错提、不把身份证后11位当号码——这一步卡住很多人,手动翻找一上午也搞不完。
用WPS专属REGEXP函数一键提取(推荐给WPS用户)
WPS表格内置正则函数,无需启VBA、不需Power Query,输入一个公式就能直接返回匹配结果,操作起来很简单,直接在空白单元格写公式就行。
在B1单元格输入:=REGEXP(A1,"1[3-9]\d{9}")
按Enter确认,B1即显示A1中第一个符合规则的手机号;若A1含多个手机号,该公式只返回首个。如需全部提取,改用:=REGEXP(A1,"1[3-9]\d{9}",,1),第四个参数设为1表示返回全部匹配项,以逗号分隔。
向下填充整列,全部文本自动完成扫描。注意:此函数仅WPS支持,Excel原生不识别,强行粘贴会报#NAME?错误。
用Excel原生公式暴力遍历提取(兼容所有Excel版本)
适用于必须用Microsoft Excel且无法启用宏或Power Query的场景,原理是让Excel从第1位到第99位逐个截取11字符,再筛选出纯数字且首位为1的合法号码。
第一步:在B1输入数组公式:=LOOKUP(9E+307,--MID(A1&"a",ROW($1:$99),11))
第二步:按 Ctrl+Shift+Enter 组合键确认(不是回车),公式两端自动加上大括号{},表示进入数组计算模式。
第三步:选中B1→双击填充柄向下拖至数据末行,批量处理整列。
这个公式靠“9E+307”触发LOOKUP模糊查找最大数值的特性,把所有非数字截取结果转为错误值,只留下合法11位数字参与比对。但有个硬伤:如果一行里有两个手机号,它只会返回靠后的那个——因为LOOKUP取的是最后一个有效值。
用Power Query智能清洗并筛选(适合大批量、高干扰数据)
当你面对的是上万行嵌套在合同、聊天记录、工单备注里的文本,且里面混着身份证、订单号、固话等多位数字时,Power Query能真正帮你守住“11位+开头是1+第二位是3-9”的三重校验线。
方法一:按非数字拆分 → 筛长度 → 校号段
选中数据列 → 【数据】选项卡 → “从表格/区域”导入(勾选“表包含标题”)→ 进入Power Query编辑器 → 选择该列 → 【转换】→【拆分列】→【按非数字字符】→ 生成多列后,全选新列 → 右键【更改类型】→【整数】→ 出现错误值的自动变null → 添加自定义列,公式填:=if Text.Length(Text.From([Column1]))=11 and Text.Start(Text.From([Column1]),1)="1" and Text.Contains("3456789",Text.Middle(Text.From([Column1]),1,1)) then [Column1] else null → 筛选该列非空 → 【关闭并上载】。
方法二:逐字符拆解 → 向下填充 → 合并连续数字块
右键该列 → 【转换】→【拆分为列】→【按每个字符】→ 全选所有新列 → 【转换】→【数据类型】→【整数】→ 【转换】→【填充】→【向下】→ 【转换】→【合并列】→ 分隔符选“无”→ 添加条件列,判断合并后文本长度是否等于11且首字符为"1" → 筛出真手机号。
用VBA正则函数一次定义、全表复用(适合高频重复处理)
如果你每周都要处理同类数据,值得花3分钟部署一个永久可用的GetMobile函数,之后只需写=GetMobile(A1)就能调用,比每次重输长公式快得多。
按Alt+F11打开VBA编辑器 → 左侧工程资源管理器中右键任一工作簿 →【插入】→【模块】→ 粘贴以下代码:
Function GetMobile(str As String) As String
Dim reg As Object
Set reg = CreateObject("VBScript.RegExp")
With reg
.Pattern = "1[3-9]\d{9}"
.Global = True
End With
If reg.Test(str) Then
GetMobile = reg.Execute(str)(0).Value
Else
GetMobile = ""
End If
End Function
关闭编辑器,回到Excel,在B1输入=GetMobile(A1) → 按Enter → 向下填充。如需提取同一单元格内多个手机号,把代码中reg.Execute(str)(0).Value改为Join(Application.Transpose(Application.Index(reg.Execute(str).Value, 0, 0)), "/"),返回斜杠分隔的全部号码。
注意:首次启用需信任宏,文件保存格式必须为.xlsm,否则函数失效。











