所以我正在构建一个带有电话号码注册的应用。在OTP页面中,我想显示电话号码(由用户输入),并带有符合以下规则的分隔符:(我来自印度尼西亚,所以我的国家代码是+62)
+628101234567890 -> +62810-1234-5678-90
628101234567890 -> 62810-1234-5678-90
08101234567890 -> 0810-1234-5678-90
有人可以帮帮我吗?先谢谢
编辑:电话号码的范围是9-14位
答案 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(如果您使用任何支持的语言进行编码)。它可以帮助您解析和格式化数字,而无需编写自己的正则表达式