libphonenumber库电话规则解读
1. 表格形式的元数据
https://github.com/google/libphonenumber/tree/master/resources/metadata
java
├─ 86 区号86对应中国
│ └─ examples.csv 电话示例
│ └─ formats.csv 电话格式
│ └─ operators.csv 电话运营商
│ └─ ranges.csv 电话具体规则
│ └─ shortcodes.csv 短号码
├─ 852 区号852对应中国香港
├─ 853 区号853对应中国澳门
...
2. xml格式的元数据
https://github.com/google/libphonenumber/blob/master/resources/PhoneNumberMetadata.xml
以中国澳门的数据举例说明
xml
<territory id="MO" countryCode="853" internationalPrefix="00">
<availableFormats>
<numberFormat pattern="(\d{4})(\d{3})">
<leadingDigits>0</leadingDigits>
<format>$1 $2</format>
</numberFormat>
<numberFormat pattern="(\d{4})(\d{4})">
<leadingDigits>[268]</leadingDigits>
<format>$1 $2</format>
</numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>
0800\d{3}|
(?:
28|
[68]\d
)\d{6}
</nationalNumberPattern>
</generalDesc>
<!-- Added support to specific 811 sub range(3 digit granularity) based on info in
telecommunications.ctt.gov.mo. Other ranges are from ITU doc. -->
<fixedLine>
<possibleLengths national="8"/>
<exampleNumber>28212345</exampleNumber>
<nationalNumberPattern>
(?:
28[2-9]|
8(?:
11|
[2-57-9]\d
)
)\d{5}
</nationalNumberPattern>
</fixedLine>
<mobile>
<possibleLengths national="8"/>
<exampleNumber>66123456</exampleNumber>
<nationalNumberPattern>
6800[0-79]\d{3}|
6(?:
[235]\d\d|
6(?:
0[0-5]|
[1-9]\d
)|
8(?:
0[1-9]|
[14-8]\d|
2[5-9]|
[39][0-4]
)
)\d{4}
</nationalNumberPattern>
</mobile>
<tollFree>
<possibleLengths national="7"/>
<exampleNumber>0800501</exampleNumber>
<nationalNumberPattern>0800\d{3}</nationalNumberPattern>
</tollFree>
</territory>
2.1 各种电话号码类型的规则
2.1.1 电话号码整体规则
xml
<generalDesc>
<nationalNumberPattern>
0800\d{3}|
(?:
28|
[68]\d
)\d{6}
</nationalNumberPattern>
</generalDesc>
澳门的国家电话号码模式包含以下规则:
- 免费电话号码:以0800开头,后跟3位数字,总共7位数字(例如:
0800xxx
)。 - 固定线路和移动电话号码:模式为
(?:28|[68]\d)\d{6}
,具体规则如下:- 可以以28开头,后跟6位任意数字,总共8位数字(例如:
28xxxxxx
)。 - 可以以6或8开头,第二位是任意数字,后跟6位任意数字,总共8位数字(例如:
6xxxxxxx
或8xxxxxxx
)。
- 可以以28开头,后跟6位任意数字,总共8位数字(例如:
2.1.2 固定电话
xml
<fixedLine>
<possibleLengths national="8"/>
<exampleNumber>28212345</exampleNumber>
<nationalNumberPattern>
(?:
28[2-9]|
8(?:
11|
[2-57-9]\d
)
)\d{5}
</nationalNumberPattern>
</fixedLine>
- 号码长度:澳门的固定线路电话号码长度为8位数字。
- 示例号码:一个固定线路电话号码的例子是
28212345
。 - 号码规则:固定线路电话号码的模式为:
(?: 28[2-9]| 8(?: 11| [2-57-9]\d ) )\d{5}
:这部分表示固定电话号码可以以28开头(但第三位数字不为0或1),或者以8开头(第二位数字可以是1或2到5以及7到9之间的任何数字)。后面跟随5位任意数字。
2.1.3 移动电话
xml
<mobile>
<possibleLengths national="8"/>
<exampleNumber>66123456</exampleNumber>
<nationalNumberPattern>
6800[0-79]\d{3}|
6(?:
[235]\d\d|
6(?:
0[0-5]|
[1-9]\d
)|
8(?:
0[1-9]|
[14-8]\d|
2[5-9]|
[39][0-4]
)
)\d{4}
</nationalNumberPattern>
</mobile>
- 号码长度:澳门的移动电话号码长度也是8位数字。
- 示例号码:一个移动电话号码的例子是
66123456
。 - 号码规则:移动电话号码的模式为:
6800[0-79]\d{3}
:这部分表示手机号码可以以6800开头,其后跟随0至7或9的一个数字,再加上任意3个数字。6(?: [235]\d\d| 6(?: 0[0-5]| [1-9]\d )| 8(?: 0[1-9]| [14-8]\d| 2[5-9]| [39][0-4] ) )\d{4}
:这部分表示手机号码以6开头,第二位数字根据不同的模式有不同的规定,整个号码长度为8位数字。
2.1.4 免费电话
xml
<tollFree>
<possibleLengths national="7"/>
<exampleNumber>0800501</exampleNumber>
<nationalNumberPattern>0800\d{3}</nationalNumberPattern>
</tollFree>
- 号码长度:澳门的免费电话号码长度为7位数字。
- 示例号码:一个免费电话号码的例子是
0800501
。 - 号码规则:免费电话号码的模式为
0800\d{3}
,表示号码以0800开头,后面跟随3位任意数字。
2.2 电话号码格式化
xml
<availableFormats>
<numberFormat pattern="(\d{4})(\d{3})">
<leadingDigits>0</leadingDigits>
<format>$1 $2</format>
</numberFormat>
<numberFormat pattern="(\d{4})(\d{4})">
<leadingDigits>[268]</leadingDigits>
<format>$1 $2</format>
</numberFormat>
</availableFormats>
澳门电话号码的格式化规则包括:
- 固定线路电话号码格式:当电话号码以0开头时,号码格式化为四位数字、三位数字的形式(例如:
xxxx xxx
)。 - 移动和其他固定线路电话号码格式:当电话号码以2、6或8开头时,号码格式化为四位数字、四位数字的形式(例如:
xxxx xxxx
)。