使用libphonenumber验证电话号码 - Baeldung


在本快速教程中,我们将看到如何使用Google的开源库libphonenumber来验证Java中的电话号码。
首先,我们需要在pom.xml中添加此库的依赖项:

<dependency>
    <groupId>com.googlecode.libphonenumber</groupId>
    <artifactId>libphonenumber</artifactId>
    <version>8.12.10</version>
</dependency>

最新版本信息可以在Maven Central上找到。

现在,我们可以使用该库提供的所有功能。
让我们看一些如何使用其各种API进行验证的示例。
重要的是,在所有示例中,我们将使用此类的单例对象进行方法调用:

PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance();

该库提供了一个实用程序类PhoneNumberUtil,它提供了几种j检查电话号码的方法。使用P honeNumberUtil#isPossibleNumber,我们可以检查给定号码是否适用于特定的国家或地区代码
例如,以美国为例,其国家代码为1。我们可以通过以下方式检查给定的电话号码是否可能是美国号码:

@Test
public void givenPhoneNumber_whenPossible_thenValid() {
    PhoneNumber number = new PhoneNumber();
    number.setCountryCode(1).setNationalNumber(123000L);
    assertFalse(phoneNumberUtil.isPossibleNumber(number));
    assertFalse(phoneNumberUtil.isPossibleNumber("+1 343 253 00000", "US"));
    assertFalse(phoneNumberUtil.isPossibleNumber(
"(343) 253-00000", "US"));
    assertFalse(phoneNumberUtil.isPossibleNumber(
"dial p for pizza", "US"));
    assertFalse(phoneNumberUtil.isPossibleNumber(
"123-000", "US"));

 

该库可识别不同类型的电话号码,例如固定电话,移动电话,免费电话,语音邮件,VoIP,寻呼机
它的实用方法isPossibleNumberForType检查给定类型是否可以在特定区域中使用给定数字。
例如,我们去阿根廷吧,因为它允许不同类型的数字使用不同的可能长度。
因此,我们可以使用它来演示此API的功能:

@Test
public void givenPhoneNumber_whenPossibleForType_thenValid() {
    PhoneNumber number = new PhoneNumber();
    number.setCountryCode(54);
 
    number.setNationalNumber(123456);
    assertTrue(phoneNumberUtil.isPossibleNumberForType(number, PhoneNumberType.FIXED_LINE));
    assertFalse(phoneNumberUtil.isPossibleNumberForType(number, PhoneNumberType.TOLL_FREE));
 
    number.setNationalNumber(12345678901L);
    assertFalse(phoneNumberUtil.isPossibleNumberForType(number, PhoneNumberType.FIXED_LINE));
    assertTrue(phoneNumberUtil.isPossibleNumberForType(number, PhoneNumberType.MOBILE));
    assertFalse(phoneNumberUtil.isPossibleNumberForType(number, PhoneNumberType.TOLL_FREE));

以上代码验证了阿根廷允许使用6位固定电话号码和11位移动电话号码。
 
isAlphaNumber方法用于验证给定的电话号码是否为有效的字母数字,例如325-CARS:
@Test
public void givenPhoneNumber_whenAlphaNumber_thenValid() {
    assertTrue(phoneNumberUtil.isAlphaNumber("325-CARS"));
    assertTrue(phoneNumberUtil.isAlphaNumber(
"0800 REPAIR"));
    assertTrue(phoneNumberUtil.isAlphaNumber(
"1-800-MY-APPLE"));
    assertTrue(phoneNumberUtil.isAlphaNumber(
"1-800-MY-APPLE.."));
    assertFalse(phoneNumberUtil.isAlphaNumber(
"+876 1234-1234"));
}

有效的字母数字开头至少应包含三个数字,然后是三个或更多字母。上面的实用程序方法首先剥离给定输入的所有格式,然后检查这种情况。
 
isValidNumber使用前缀和长度信息进行完整的验证:
@Test
public void givenPhoneNumber_whenValid_thenOK() throws Exception {
 
    PhoneNumber phone = phoneNumberUtil.parse("+911234567890"
      CountryCodeSource.UNSPECIFIED.name());
 
    assertTrue(phoneNumberUtil.isValidNumber(phone));
    assertTrue(phoneNumberUtil.isValidNumberForRegion(phone,
"IN"));
    assertFalse(phoneNumberUtil.isValidNumberForRegion(phone,
"US"));
    assertTrue(phoneNumberUtil.isValidNumber(phoneNumberUtil.getExampleNumber(
"IN")));
}

无论是否指定国家区域,该号码都会被验证。 
 
isNumberGeographical检查给定数字号码是否具有与其关联的地理或区域:
@Test
public void givenPhoneNumber_whenNumberGeographical_thenValid() throws NumberParseException {
    
    PhoneNumber phone = phoneNumberUtil.parse("+911234567890", "IN");
    assertTrue(phoneNumberUtil.isNumberGeographical(phone));
 
    phone = new PhoneNumber().setCountryCode(1).setNationalNumber(2530000L);
    assertFalse(phoneNumberUtil.isNumberGeographical(phone));
 
    phone = new PhoneNumber().setCountryCode(800).setNationalNumber(12345678L);
    assertFalse(phoneNumberUtil.isNumberGeographical(phone));

在这里,在上面的第一个断言中,我们以国际格式给出了带有地区代码的电话号码,并且该方法返回true。第二个断言使用美国本地号码,第三个断言使用免费电话号码。因此,API对于这两个返回false。
源代码可以在GitHub上获得