如何将手机号码拆分为国家/地区代码,区号和本地号码? 例如拆分后的+919567123456
国家/地区代码= 91
区号= 9567
本地号码= 123456
答案 0 :(得分:48)
不要维护自己的所有这些数据表!使用“Java International Phone Number Utilities library v3.0”,https://github.com/googlei18n/libphonenumber。这就是Google使用的,Google会为您维护它!
答案 1 :(得分:22)
使用简单的算法解析电话号码是不可能的,您需要使用填写了每个国家/地区规则的数据表 - 因为每个国家/地区都以不同的方式划分电话号码。
国家/地区代码相当简单,只需使用维基百科中Country calling codes文章中的数据,并构建一个包含所有唯一国家/地区代码的表格。每个国家/地区都有一个唯一的前缀,因此很容易。
但是,您需要查找要支持的每个国家/地区的规则,并使用每个国家/地区的规则提取区号。
答案 2 :(得分:4)
正如各种人所说,你不能用简单的字符串匹配来做到这一点。国家和地区代码的长度都是固定的。
在过去做过这个时,我们维护了一个类似于以下结构的表: -
+------------+---------+-------+--------------+ |country_code|area_code|country|area | +------------+---------+-------+--------------+ |44 |1634 |UK |Medway | |44 |20 |UK |London | |964 |23 |Iraq |Wasit (Al Kut)| |964 |2412 |Iraq |Unreal | +------------+---------+-------+--------------+
然后我们计算了area_code和country_code的最大长度,并通过从最大长度开始的子串,检查字符串,然后向下工作,直到找到匹配为止。
所以给出了号码441634666788
我们可以从子串[1,7]开始(7是最长的国家/地区代码组合的长度),找不到匹配,然后转到[1,6]并找到匹配的英国/梅德韦。
效率不高但有效。
编辑
你也可以尝试这样的东西,但是你需要用完整的数据集进行测试,或者甚至将它分解成单独的国家和地区代码选择,因为它可能不是很适合你所选择的数据库。
DECLARE @area_codes TABLE
(
country_code VARCHAR(10),
area_code VARCHAR(10),
country VARCHAR(20),
area VARCHAR(20),
match_string VARCHAR(MAX),
match_length INTEGER
)
INSERT INTO @area_codes VALUES ('44','1382','UK','Dundee', '441382%', 6)
INSERT INTO @area_codes VALUES ('44','1386','UK','Evesham', '441386%', 6)
INSERT INTO @area_codes VALUES ('44', '1', 'UK', 'Geographic numbers', '441%', 3)
DECLARE @number VARCHAR(MAX)
SET @number = '441386111111'
SELECT TOP 1 *
FROM @area_codes
WHERE @number LIKE match_string
ORDER BY match_length DESC
您可以通过触发器维护match_string和match_length字段,注意处理空区域代码并在match_string列上索引表。
答案 3 :(得分:3)
我认为你需要像国家和地区代码字典这样的东西。因为他们的摊位可以有不同的长度。美国+1,德国+49,甚至+6723。与区号相同..
答案 4 :(得分:3)
答案很大程度上取决于国家。没有通用规则说“这是国家代码,这是区号,这是本地号码”。可以普遍获得的唯一信息是国家号码(甚至可以是1-4位数字);那么你需要咨询具体国家的规则集。
对于示例(例如,“指定国家/地区有许多不同的电话号码,但它们都遵循相同的格式”):
答案 5 :(得分:1)
如果您努力准确英国数据,请参阅http://code.google.com/p/ofcom-csverter/以获取包含更正的英国区号的完整列表。
答案 6 :(得分:0)
一个非常复杂的问题。首先,您需要确定country code。根据国家/地区代码,其余部分必须分为区号和本地号码。但这三个部分都没有固定的长度,不是孔数,也不是区号和局部组合!
示例:4930123456789
示例:493328123456
示例:34971123456