从写这种东西的经验来看,要做到 100% 的可靠性真的很难。为此,我编写了一些 Java 代码,这些代码在处理我们拥有的数据方面相当出色,但并不适用于每个国家/地区。你需要问的问题是:
国家之间的字符到数字映射是否一致?美国使用了很多这种(例如 1800-GOT-MILK),但在澳大利亚,例如,它非常罕见。您需要做的是确保您正在为所讨论的国家/地区进行正确的映射,如果它不同(它可能不会)。我不知道使用不同字母的国家(例如俄罗斯的西里尔语和前东区国家)是做什么的;
您必须接受您的解决方案不会是 100%,而且您不应该期望它会是 100%。您需要采取“最佳猜测”方法。例如,没有真正的方法知道 132345 是澳大利亚的有效电话号码,1300 123 456 也是如此,但这是唯一用于 13xx 号码的两种模式,它们不能从海外拨打;
您还必须询问是否要验证区域(区号)。我相信美国使用的系统是区号的第二个数字是 1 或 0。这可能曾经是这种情况,但我不确定它是否仍然适用。无论如何,许多其他国家会有其他规则。在澳大利亚,固定电话和移动(手机)电话的有效区号是两位数(第一位是 0)。08、03 和 04 都有效。01 不是。你如何满足这一点?你想要_____吗?
各国使用不同的约定,无论他们写多少位数。您必须决定是否要接受“规范”以外的东西。这些在澳大利亚都很常见:
- (02) 1234 5678
- 02 1234 5678
- 0411 123 123(但我从未见过 04 1112 3456)
- 131 123
- 13 1123
- 131 123
- 1 300 123 123
- 1300 123 123
- 02-1234-5678
- 1300-234-234
- +44 78 1234 1234
- +44 (0)78 1234 1234
- +44-78-1234-1234
- +44-(0)78-1234-1234
- 0011 44 78 1234 1234(0011是标准国际拨号代码)
- (44) 078 1234 1234(不常见)
这就是我的想法。为一国。例如,在法国,通常将电话号码以数字对(12 34 56 78)的形式写出来,他们也这样发音:而不是:
un (一), deux (二), trois (三), ...
它的
douze (十二), trente-quatre (三十四), ...
你想迎合这种程度的文化差异吗?我认为不会,但这个问题值得考虑,以防你的规则过于严格。
此外,有些人可能会在电话号码上附加分机号码,可能带有“分机”或类似的缩写。你想迎合那个吗?
抱歉,这里没有代码。只是列出要问自己的问题和要考虑的问题。正如其他人所说,一系列正则表达式可以完成上述大部分工作,但最终电话号码字段(大部分)是一天结束时的自由格式文本。