【发布时间】:2014-10-08 09:27:39
【问题描述】:
我正在尝试解决如下所述的问题:
给定一个电话号码,将其拆分为国家代码、本地区域代码和号码。数字格式为 -
[Country code]-[Local Area Code]-[Number]
国家代码由 1-3 位组成,本地区号由 1-3 位组成,号码为 4-10 位(一律为 12 位)。
三个部分之间的分隔符可以是'-'(连字符)或''(空格)。
例子:
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,意思是“找不到匹配”。
【问题讨论】:
-
"但是这个正则表达式不匹配任何输入测试用例。"比如什么?
-
发布你的java代码..
-
输出格式应为
CountryCode=1,LocalAreaCode=877,Number=2638277 CountryCode=91,LocalAreaCode=011,Number=23413627reegx 没有问题。改进输出格式 -
@Tichodroma 我举了个例子,贴出代码
-
我认为问题在于您如何阅读输入。