[英]RegEx for normalising UK telephone number
我正在尝试将英国电话号码标准化为国际格式。
以下字符串应解析为:+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
谢谢
如果您仍然想要正则表达式,我可以使它像这样运行:
"+44" + System.out.println(replaceAll("[^0-9]", "")
.replaceAll("^0{0,2}(44){0,2}0{0,1}(\\d{10})", "$2"));
编辑:更改代码以反映失败的测试。 在运行正则表达式之前删除了非数字字符。
编辑:基于注释更新代码。
像我在这里的答案一样,我也建议您查看Google libphonenumber
库。 我知道它不是正则表达式,但它确实可以满足您的要求。
文档中的示例如下所示(使用其他语言提供):
假设您有一个代表瑞士电话号码的字符串。 这是将其解析/标准化为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));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.