【问题标题】:Regex for splitting a phone number用于拆分电话号码的正则表达式
【发布时间】: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=23413627 reegx 没有问题。改进输出格式
  • @Tichodroma 我举了个例子,贴出代码
  • 我认为问题在于您如何阅读输入。

标签: java regex


【解决方案1】:

这行得通:

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

【讨论】:

  • 显然是这样......我在我的代码中发现了错误。我没有使用matches() 或find() 之类的匹配函数。非常感谢:)
【解决方案2】:
Country Code    : 1  
Local Area Code : 425  
Number          : 9854706

您需要使用find() 对象上的find() 方法在while 循环中捕获组:

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));
    }
}

【讨论】:

  • 感谢您的回答,我没有使用matches()或find()之类的匹配函数,导致异常
【解决方案3】:

以下表达式将解析电话号码,从右到左拉动各个部分(如果存在),忽略非数字分隔符。

.*?(?<country>[\d]*?)\D*(?<areacode>\d{0,3})\D*(?<prefix>\d{0,3})\D*(?<line>\d{0,4})$

【讨论】:

    【解决方案4】:
    //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();
    
        }
    
    }
    

    【讨论】:

      【解决方案5】:
      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++;
          }
      
      
      }
      

      }

      【讨论】:

      • 虽然这段代码可以回答这个问题,但最好在不介绍其他代码的情况下解释它是如何解决问题的,以及为什么要使用它。从长远来看,纯代码的答案没有用处。
      【解决方案6】:

      在这个例子中使用 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
      

      【讨论】:

        猜你喜欢
        • 2012-04-28
        • 1970-01-01
        • 2017-09-23
        • 2014-02-15
        • 2015-12-21
        • 1970-01-01
        相关资源
        最近更新 更多