2013-05-09 78 views
4

我具有以下正则表达式以下手机号码:移动电话号码vaidation的正则表达式?

^(([+]|[0]{2})([\\d]{1,3})([\\s-]{0,1}))?([\\d]{10})$ 

有效数字是:如果用户输入9或11位移动号码

+123-9854875847 
0
+123 9854875847 
9878757845 

上述表达式不会验证,但如果用户输入9或11位数字分别为+123+91,那么它将得到验证,因为在这部分表达式([\\d]{1,3})后两位数字是可选的。

所以任何方式使这部分([\\s-]{0,1}))?([\\d]{10})不得与这部分结合起来([\\d]{1,3})

抱歉,如果问题不够清楚。

+2

一些简化 - '[\\ d]'='\\ d','{0,1}'='?','[+]'='\\ +','[0 ]'='0'。 – Dukeling 2013-05-09 11:08:30

+0

程序如何知道哪个是哪个?您需要检查允许的前缀列表才能使用。 – Keppil 2013-05-09 11:18:17

+0

意味着我应该在不同的文本框中获得前缀,并且regx没有任何其他方式? – user460293 2013-05-09 11:21:36

回答

3

这个问题有点不清楚,但我想你想拆分数字和国家代码。

这很容易通过提取组来完成。 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)); 
} 

Reference

Related test

0

以两部分输入的最佳方式,即国家代码和手机号码。 在这种情况下,您可以使用正则表达式轻松验证它(国家代码和手机号码)。

1

只要分机总是与电话号码的其余部分分开,您的正则表达式就可以正常工作。如果没有这种分离,则无法正确验证电话号码。

另外请记住,从国家到国家的长度和电话号码可能会有所不同,所以没有正则表达式可以解决所有情况。如果您可以生成允许的扩展名列表,则可以将其应用到正则表达式中并获得更好的匹配,但对于许多任意长度的数字组,您将得到许多错误匹配。

我简化了你的正则表达式,所以oyu可以在实践中看到@Dukeling的建议。你的正则表达式,我的底部。

^(([+]|[0]{2})([\\d]{1,3})([\\s-]{0,1}))?([\\d]{10})$ 
^( (\\+|00) \\d{1,3} [\\s-]?)?  \\d{10} $ 
0
try { 


      String mobile_number="india number +919979045000\n" + 
        "india number 9979045000\n" + 
        "china number +86 591 2123654\n" + 
        "Brazil number +55 79 2\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 2, +20 10 1234567, +33 123456789, +852 1234 5456, +52 55 12345678, +919979045000, 9979045000] */ 


     } catch (Exception e) { 
      e.printStackTrace(); 
     }