我正在尝试将英国电话号码标准化为国际格式。
以下字符串应解析为:+447834012345
到目前为止,我已经得到了这个:
"+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
由于
答案 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));