2014-10-08 36 views
1

我試圖解決如下所述的問題:用於拆分電話號碼的正則表達式

給定一個電話號碼,將其分爲國家代碼,本地區號和號碼。數字格式爲 -

[Country code]-[Local Area Code]-[Number] 

國家代碼由1-3數字,本地區域代碼由1-3數字和數量爲4-10位長(總共12位總是)。

3部分之間的分隔符可以是' - '(連字符)或''(空格)。

實施例:

Given Number = 1-425-9854706 
Result --> Group 1 = 1   --> Country Code 
      Group 2 = 425  --> Local Area Code 
      Group 3 = 9854706 --> Number 

我使用目前對於相同的正則表達式是 -

^(\\d{1,3})[- ](\\d{1,3})[- ](\\d{4,10})$ 

我採取捕獲組的結果1,2和3

但這個正則表達式不匹配任何輸入測試用例。如果有幫助,我使用java.util.regex包。請爲相同的建議一個更好的正則表達式。有關該問題上https://www.hackerrank.com/challenges/split-number

我寫的代碼更多信息是這樣的:

import java.io.*; 
import java.util.*; 
import java.text.*; 
import java.math.*; 
import java.util.regex.*; 

public class Solution { 

    public static void main(String[] args) { 
     /* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution. */ 

     Scanner sc = new Scanner(System.in); 
     int n = Integer.parseInt(sc.nextLine()); 

     ArrayList<ArrayList<Integer>> output = new ArrayList<ArrayList<Integer>>(); 

     String s; 

     String REGEX = "^(\\d{1,3})[- ](\\d{1,3})[- ](\\d{4,10})$"; 
     Pattern pattern = Pattern.compile(REGEX); 

     Matcher matcher; 

     for(int i=0 ; i<n ; i++) { 
      ArrayList<Integer> list = new ArrayList<Integer>(); 

      s = sc.nextLine(); 
      matcher = pattern.matcher(s); 

      list.add(Integer.parseInt(matcher.group(1))); 
      list.add(Integer.parseInt(matcher.group(2))); 
      list.add(Integer.parseInt(matcher.group(3))); 

      output.add(list); 
     } 

     sc.close(); 

     for(int i=0 ; i<n ; i++) { 
      System.out.print("CountryCode="+output.get(i).get(0)+","); 
      System.out.print("LocalAreaCode="+output.get(i).get(1)+","); 
      System.out.print("Number="+output.get(i).get(2)); 
      System.out.println(""); 
     } 
    } 
} 

它給了我一個IllegalStateException異常,意思是「沒有找到匹配」。

+0

「但這正則表達式不匹配任何輸入測試案例。」像什麼? – 2014-10-08 09:29:42

+1

發佈您的java代碼.. – 2014-10-08 09:29:49

+0

輸出格式應該是'CountryCode = 1,LocalAreaCode = 877,Number = 2638277 CountryCode = 91,LocalAreaCode = 011,Number = 23413627'沒有問題reegx.improve輸出格式 – vks 2014-10-08 09:34:30

回答

2

這工作:

package de.lhorn.stackoverflow; 

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class Main { 
    public static void main(String[] args) { 
     Pattern phoneNumber = Pattern 
       .compile("^(\\d{1,3})[- ](\\d{1,3})[- ](\\d{4,10})$"); 

     Matcher matcher = phoneNumber.matcher("1-425-9854706"); 
     if (matcher.matches()) { 
      System.out.println(matcher.group(1)); 
      System.out.println(matcher.group(2)); 
      System.out.println(matcher.group(3)); 
     } 

    } 
} 

輸出:

1 
425 
9854706 
+0

顯然它確實....我在我的代碼中找到了錯誤。我沒有使用match()或find()等匹配函數。非常感謝:) – Rohan 2014-10-08 09:44:28

2
Country Code : 1 
Local Area Code : 425 
Number   : 9854706 

您需要捕獲在一個while循環組,採用find()方法Matcher對象:

import java.util.regex.*; 

public class PhoneRegexTest { 
    public static void main (String[] args) { 
     String line = "1-425-9854706"; 
     Pattern pattern = Pattern.compile("^(\\d{1,3})[- ](\\d{1,3})[- ](\\d{4,10})$"); 
     Matcher matcher = pattern.matcher(line); 

     while (matcher.find()) { 
      printMatch("Country Code", matcher, 1); 
      printMatch("Local Area Code", matcher, 2); 
      printMatch("Number", matcher, 3); 
     } 
    } 

    public static void printMatch(String label, Matcher m, int group) { 
     System.out.printf("%-16s: %s%n", label, m.group(group)); 
    } 
} 
+0

感謝您的回答,我沒有使用match()或find()等匹配函數,導致異常 – Rohan 2014-10-08 09:48:15

-1

這可能是更容易使用String.split功能,在這個例子:

String fullNumber = "1-425-9854706"; 

String[] splitNumber = fullNumber.split("-"); 

String countryCode = splitNumber[0]; // 1 
String areaCode = splitNumber[1];  // 425 
String number = splitNumber[2];  // 9854706 
0

以下表達式將解析一個電話號碼,從右側拉動各個部分留下,如果存在的話,忽略非數字分隔符。

.*?(?<country>[\d]*?)\D*(?<areacode>\d{0,3})\D*(?<prefix>\d{0,3})\D*(?<line>\d{0,4})$ 
0
//for an application that accepts user input 
//user input in the form (555) 555-5555 

import java.util.Scanner; 

public class PhoneNumberTokenizer 
{ 

    public static void main(String[] args) 
    { 

     Scanner scanner = new Scanner(System.in); 
     System.out.println("Enter phone number to tokenize: "); 

     String phoneNumber = scanner.nextLine(); 

     String[] tokens = phoneNumber.split("\\D+"); 

     System.out.println("The tokens are: "); 

     for(String token : tokens) 
      System.out.println(token); 

     System.out.println(); 

    } 

} 
0
public static void main(String[] args) { 


    Scanner sc =new Scanner(System.in); 
    int a =sc.nextInt(); 
    sc.nextLine(); 
    int i =1; 
    while(i<=a) 
     { 
     String s =sc.nextLine(); 
     String[] words =s.trim().split("[ -]"); 
     System.out.println("CountryCode="+words[0]+","+"LocalAreaCode="+words[1]+"," +"Number="+words[2]); 
     i++; 
    } 


} 

}

+0

儘管此代碼可能會回答問題,但最好解釋它如何解決問題而不介紹其他人以及爲什麼使用它。從長遠來看,僅有代碼的答案是沒有用的。 – JAL 2015-12-01 19:41:47