如何使用正则表达式忽略电话号码(带或不带+)的国家/地区代码

时间:2018-05-17 08:22:34

标签: java regex

所以我正在构建一个带有电话号码注册的应用。在OTP页面中,我想显示电话号码(由用户输入),并带有符合以下规则的分隔符:(我来自印度尼西亚,所以我的国家代码是+62)

+628101234567890 -> +62810-1234-5678-90
628101234567890  -> 62810-1234-5678-90
08101234567890   -> 0810-1234-5678-90

有人可以帮帮我吗?先谢谢

编辑:电话号码的范围是9-14位

3 个答案:

答案 0 :(得分:2)

您可以将String::replaceAll与符合多个群组的正则表达式^(.*)(....)(....)(..)$一起使用,例如:

String[] phones = {"+628101234567890", "628101234567890", "08101234567890"};
for (String phone : phones) {
    System.out.println(phone.replaceAll("(.*)(....)(....)(..)", "$1-$2-$3-$4"));
}

输出

+62810-1234-5678-90
62810-1234-5678-90
0810-1234-5678-90

您甚至可以使用此正则表达式(.*)(\d{4})(\d{4})(\d{2})

详情

我想从头到尾解释正则表达式:

  • (..)最后一组匹配2个字符
  • (....)(....)两个包含4个字符的小组
  • (.*)和其他角色

答案 1 :(得分:1)

String formatTelephone(String tel) {
    return tel.replace(" ", "")
              .replaceFirst("^(0|\\+?62)(\\d{3})(\\d{4})(\\d4)",
                             "$1$2-$3-$4-")
              .replaceFirst("^(0|\\+?62)(\\d{3})(\\d{4})",
                             "$1$2-$3-");
}

这将从开始^开始,替代0 +62和62,后跟数字组。剩下的没有被替换。并且原来的电话被退回,比如外国号码。

因为预先删除了额外的预防措施空间。

^ : start of string, so 99962999 will not match ^62
\\d : digit
X? : optional X
X{3} : XXX
(X|Y|Z) : either X, Y or Z

添加了第二个replaceFirst

要解决0810-1234-56至0810-1234-5678-90,第一次更换仅适用于较长的数字。如果被替换,则附加-导致第二个替换第一个不起作用(返回刚刚替换的字符串)。

答案 2 :(得分:0)

也许您可以查看此手机库格式google https://github.com/googlei18n/libphonenumber(如果您使用任何支持的语言进行编码)。它可以帮助您解析和格式化数字,而无需编写自己的正则表达式