phone_number_extractor.dart 3.54 KB
class PhoneNumberExtractor {
  // 提取所有电话号码(手机+座机)
  static List<String> extractAllPhoneNumbers(String text) {
    final phoneRegExp = RegExp(r'(?:(?:\+|00)86)?1[3-9]\d{9}|' // 手机
        r'(?:(?:0\d{2,3}[- ]?)?\d{7,8}(?:[- ]?\d{1,4})?)' // 座机
        );

    return phoneRegExp
        .allMatches(text)
        .map((match) => match.group(0)!)
        .toList();
  }

  // 提取手机号码
  static List<String> extractMobileNumbers(String text) {
    final mobileRegExp = RegExp(r'(?:(?:\+|00)86)?' // 国际前缀
        r'1[3-9]\d{9}' // 手机号段
        );

    return mobileRegExp
        .allMatches(text)
        .map((match) => match.group(0)!)
        .toList();
  }

  // 提取座机号码
  static List<String> extractLandlineNumbers(String text) {
    final landlineRegExp = RegExp(r'(?:0\d{2,3}[- ]?)?' // 区号
        r'\d{7,8}' // 主号码
        r'(?:[- ]?\d{1,4})?' // 分机号
        );

    return landlineRegExp
        .allMatches(text)
        .map((match) => match.group(0)!)
        .toList();
  }

  // 分类提取
  static Map<String, List<String>> extractPhoneNumbersByType(String text) {
    return {
      'mobile': extractMobileNumbers(text),
      'landline': extractLandlineNumbers(text),
      'all': extractAllPhoneNumbers(text),
    };
  }

  // 验证并格式化座机号码
  static String? formatLandlineNumber(String number) {
    // 清理输入
    String cleaned = number.replaceAll(RegExp(r'[^\d\-]'), '');

    // 验证格式
    final validRegExp = RegExp(r'^(0\d{2,3})?\d{7,8}$');

    if (!validRegExp.hasMatch(cleaned)) {
      return null;
    }

    // 格式化:添加分隔符
    if (cleaned.length >= 11) {
      // 有区号的情况
      return '${cleaned.substring(0, 4)}-${cleaned.substring(4)}';
    } else if (cleaned.length == 7 || cleaned.length == 8) {
      // 无区号的情况
      return cleaned;
    }

    return cleaned;
  }

  // 支持更多格式的座机号码

// 提取函数
 static List<String> extractFlexibleLandlines(String text) {
    final flexibleLandlineRegExp = RegExp(
        r'('
        r'(?:0(?:10|2[0-57-9]|[3-9]\d{2}))?' // 区号(010、021-029等)
        r'[- ]?' // 分隔符
        r'(?:\d{7,8})' // 主号码
        r'(?:[- ]?(?:转|分机|ext?\.?)?[- ]?\d{1,4})?' // 分机号
        r')',
        caseSensitive: false // 不区分大小写
        );
    return flexibleLandlineRegExp
        .allMatches(text)
        .map((match) => match.group(0)!)
        .toList();
  }
}


// 使用事例

//   final testText = '''
//     联系方式:
//     手机:13800138000、+8613800138001、008613800138002
//     座机:010-12345678、021-87654321、0755-1234567
//     带分机:028-87654321-1234
//     无区号:12345678
//     其他格式:(010)12345678、010 1234 5678
//   ''';

//   // 提取所有电话号码
//   final allNumbers = PhoneNumberExtractor.extractAllPhoneNumbers(testText);
//   print('所有电话号码: $allNumbers');

//   // 只提取座机
//   final landlines = PhoneNumberExtractor.extractLandlineNumbers(testText);
//   print('座机号码: $landlines');

//   // 只提取手机
//   final mobiles = PhoneNumberExtractor.extractMobileNumbers(testText);
//   print('手机号码: $mobiles');

//   // 分类提取
//   final categorized = PhoneNumberExtractor.extractPhoneNumbersByType(testText);
//   print('分类结果: $categorized');

//   // 格式化示例
//   final formatted = PhoneNumberExtractor.formatLandlineNumber('01012345678');
//   print('格式化后: $formatted'); // 输出: 010-12345678
// }