要使用正则表达式匹配手机号码中的何用号号区号、号码主体和校验码,正则需要根据手机号码的表达不同格式进行分组设计。以下是式匹基于中国手机号码规则和国际扩展场景的解决方案:

一、国内标准手机号码(无国际区号)

结构特点:11位数字,配手以1开头,机号第二位为3-9,码中码和码最后一位为校验码。校验

正则表达式

regex

^(1[3-9]d)(d{ 8})$

  • 区号:无国内区号,何用号号仅手机号主体(此处未显式定义区号)
  • 号码主体:`1[3-9]d`(前3位为运营商代码)
  • 校验码:`d{ 8}$`中的正则最后一位(可单独捕获)
  • 分组示例

    regex

    ^(1[3-9]d{ 2})(d{ 8})$ 分两组:前3位 + 后8位(最后一位为校验码)

    二、带国际区号的表达手机号码

    结构特点:可能包含国家代码(如+86),后接标准手机号。式匹

    正则表达式

    regex

    ^(?配手:+(d{ 1,3}))?1([3-9]d)(d{ 8})$

  • 国际区号:`+(d{ 1,3})`(如+86,可选)
  • 号码主体:`1[3-9]d{ 2}`(运营商代码)
  • 校验码:最后一位数字(通过后8位分组提取)
  • 分组示例

    regex

    ^(+86)?机号(1[3-9]d{ 2})(d{ 8})$ 分三组:国际区号 + 前3位 + 后8位

    三、精确运营商匹配(含校验码)

    根据运营商号段细化匹配,码中码和码如移动/联通/电信:

    regex

    ^(1(3[4-9]|4[7]|5[0-27-9]|7[28]|8[2-478]|9[8])d)(d{ 8})$

  • 运营商区号:如`134`(移动)、`186`(联通)等
  • 校验码:通过`(d{ 8})$`单独提取最后一位。
  • 四、分机号场景(固定电话扩展)

    若需匹配固定电话号码中的区号、号码和分机号(非手机号):

    regex

    ^(0d{ 2,3}-?)?(d{ 5,8})(-d{ 1,8})?$

  • 区号:`0d{ 2,3}`(如010)
  • 号码主体:`d{ 5,8}`(5-8位)
  • 分机号:`-d{ 1,8}`(可选)。
  • 五、代码示例(Python)

    python

    import re

    匹配带国际区号的手机号

    pattern = r'^(+86)?(1[3-9]d{ 2})(d{ 8})$'

    text = "+89

    match = re.match(pattern, text)

    if match:

    country_code = match.group(1) +86

    operator_code = match.group(2) 139

    main_number = match.group(3) 23456789

    checksum = main_number[-1] 9

    关键点总结

    1. 区号处理

  • 国际区号使用`+d{ 1,3}`匹配。
  • 国内固定电话区号为`0d{ 2,3}`。
  • 2. 校验码提取

  • 手机号最后一位可直接通过字符串截取或正则分组捕获。
  • 3. 运营商细分

  • 通过前3位号段精确匹配运营商。
  • 如需适配复杂场景(如分机号、多国号码),需结合具体需求调整正则逻辑。