我遵循以下手机号码的正则表达式:
^(([+]|[0]{2})([\\d]{1,3})([\\s-]{0,1}))?([\\d]{10})$
有效号码是:
+123-9854875847
00123 9854875847
+123 9854875847
9878757845
如果用户输入9位或11位数的手机号码,则上述表达式不会验证,但如果用户分别输入带有+123
或+91
的9位或11位数字,那么它将获得验证,因为在此部分表达式中([\\d]{1,3})
最后两位数字是可选的。
那么,是否有任何方法可以使这部分([\\s-]{0,1}))?([\\d]{10})
不与这部分([\\d]{1,3})
结合使用?
答案 0 :(得分:4)
这个问题有点不清楚,但我认为你想要分割数字和国家代码。
通过提取组很容易做到这一点。 group(i)
是括号中的i
项。
我还应用了这些简化:[\\d]
= \\d
,{0,1}
= ?
,[+]
= \\+
,[0]{2}
= 00
。
<强>代码:强>
String regex = "^((\\+|00)(\\d{1,3})[\\s-]?)?(\\d{10})$";
String str = "+123-9854875847";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
if (m.matches())
{
System.out.println("Country = " + m.group(3));
System.out.println("Data = " + m.group(4));
}
<强>输出:强>
Country = 123
Data = 9854875847
替代使用不匹配的群组(?:
):(因此您可以使用group(1)
和group(2)
)
String regex = "^(?:(?:\\+|00)(\\d{1,3})[\\s-]?)?(\\d{10})$";
String str = "+123-9854875847";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
if (m.matches())
{
System.out.println("Country = " + m.group(1));
System.out.println("Data = " + m.group(2));
}
答案 1 :(得分:1)
只要扩展程序始终与电话号码的其余部分分开,您的正则表达式就可以正常工作。如果没有这种分离,则无法正确验证电话号码。
另请注意,扩展名和电话号码的长度因国家/地区而异,因此没有正则表达式可以解决所有情况。如果你可以生成一个允许的扩展列表,你可以将其用于正则表达式并获得更好的匹配,但对于许多任意长度的数字组,你会得到许多错误的匹配。
我已经简化了你的正则表达式,所以oyu可以在实践中看到@Dukeling的建议。你的正则表达式是最重要的,我的是在底部。
^(([+]|[0]{2})([\\d]{1,3})([\\s-]{0,1}))?([\\d]{10})$
^( (\\+|00) \\d{1,3} [\\s-]?)? \\d{10} $
答案 2 :(得分:0)
将输入分为两部分的最佳方式,即国家/地区代码和手机号码。 在这种情况下,您可以使用正则表达式轻松验证它(国家/地区代码和手机号码)。
答案 3 :(得分:0)
try {
String mobile_number="india number +919979045000\n" +
"india number 9979045000\n" +
"china number +86 591 2123654\n" +
"Brazil number +55 79 2012345\n" +
"it is test all string get mobile number all country"+
"Ezipt +20 10 1234567\n" +
"France +33 123456789\n" +
"Hong Kong +852 1234 5456\n" +
"Mexico +52 55 12345678"+
"thanks";
Pattern p = Pattern.compile("\\(?\\+[0-9]{1,3}\\)? ?-?[0-9]{1,3} ?-?[0-9]{3,5} ?-?[0-9]{5}( ?-?[0-9]{3})? ?(\\w{1,10}\\s?\\d{1,6})?");
List<String> numbers = new ArrayList<String>();
//mobile_number= mobile_number.replaceAll("\\-", "");
Matcher m = p.matcher("" + mobile_number);
while (m.find()) {
numbers.add(m.group());
}
p = Pattern.compile("\\(?\\+[0-9]{1,3}\\)? ?-?[0-9]{1,3} ?-?[0-9]{3,5} ?-?[0-9]{4}( ?-?[0-9]{3})? ?(\\w{1,10}\\s?\\d{1,6})?");
m = p.matcher("" + mobile_number);
while (m.find()) {
numbers.add(m.group());
}
p = Pattern.compile("((?:|\\+)([0-9]{5})(?: |\\-)(0\\d|\\([0-9]{5}\\)|[1-9]{0,5}))");
m = p.matcher("" + mobile_number);
while (m.find()) {
numbers.add(m.group());
}
p = Pattern.compile("[0-9]{10}|\\(?\\+[0-9]{1,3}\\)?-?[0-9]{3,5} ?-?[0-9]{4}?");
m = p.matcher("" + mobile_number);
while (m.find()) {
numbers.add(m.group());
}
String numberArray=numbers.toString();
System.out.print(""+numberArray);
// final result
/* [+919979045000, +86 591 2123654, +33 123456789, +52 55 12345678, +919979045000, +86 591 2123654, +55 79 2012345, +20 10 1234567, +33 123456789, +852 1234 5456, +52 55 12345678, +919979045000, 9979045000] */
} catch (Exception e) {
e.printStackTrace();
}