RegEx用于规范英国电话号码

时间:2016-06-06 13:28:38

标签: java regex

我正在尝试将英国电话号码标准化为国际格式。

以下字符串应解析为:+447834012345

  • 07834012345
  • 447834012345
  • 4407834012345
  • +44(0)7834 012345
  • +44 0 7834 012345
  • 004407834012345
  • 0044(0)7834012345
  • 00 44 0 7834012345

到目前为止,我已经得到了这个:

"+44" + mobile.replaceAll("[^0-9]0*(44)?0*", "")

这并没有完全削减它,因为我遇到领先0等的问题;见下表。如果可能的话,我想尽量避免使用全局标志。

Mobile              | Normalised         | 
--------------------+--------------------+------
07834012345         | +4407834012345     | FAIL
+447834012345       | +447834012345      | PASS
+4407834012345      | +447834012345      | PASS
+44 (0) 7834 012345 | +44783412345       | FAIL
+44 0 7834 012345   | +44783412345       | FAIL
004407834012345     | +44004407834012345 | FAIL
0044 (0) 7834012345 | +4400447834012345  | FAIL
00 44 0 7834012345  | +44007834012345    | FAIL
+4407834004445      | +447834004445      | PASS

由于

2 个答案:

答案 0 :(得分:1)

如果你仍然想要正则表达式,我能够让它像这样工作:

"+44" + System.out.println(replaceAll("[^0-9]", "")
  .replaceAll("^0{0,2}(44){0,2}0{0,1}(\\d{10})", "$2"));

编辑:更改了代码以反映失败的测试。在运行正则表达式之前删除了非数字字符。

编辑:根据评论更新代码。

答案 1 :(得分:0)

与我的回答here一样,我也建议您查看Google libphonenumber库。我知道它不是正则表达式,但它完全符合您的要求。

如何在Java中执行此操作(以其他语言提供)的示例如下the documentation

  

我们假设您有一个代表电话号码的字符串   瑞士。这是您将其解析/标准化为PhoneNumber的方式   对象:

String swissNumberStr = "044 668 18 00";
PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
try {
  PhoneNumber swissNumberProto = phoneUtil.parse(swissNumberStr, "CH");
} catch (NumberParseException e) {
  System.err.println("NumberParseException was thrown: " + e.toString());
}
     

此时,swissNumberProto包含:

{
  "country_code": 41,
  "national_number": 446681800
}
     

PhoneNumber是一个自动生成的类   phonenumber.proto对效率进行必要的修改。对于   有关每个字段含义的详细信息,请参阅   https://github.com/googlei18n/libphonenumber/blob/master/resources/phonenumber.proto

     

现在让我们验证号码是否有效:

boolean isValid = phoneUtil.isValidNumber(swissNumberProto); // returns true
     

格式化方法支持一些格式,如   如下图所示:

// Produces "+41 44 668 18 00"
System.out.println(phoneUtil.format(swissNumberProto, PhoneNumberFormat.INTERNATIONAL));
// Produces "044 668 18 00"
System.out.println(phoneUtil.format(swissNumberProto, PhoneNumberFormat.NATIONAL));
// Produces "+41446681800"
System.out.println(phoneUtil.format(swissNumberProto, PhoneNumberFormat.E164));