phone_number_extractor.dart
3.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
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
// }