2013-05-09 77 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(); 
     }