java 如何修复捕获组以捕获数字字符串的一部分?

lyfkaqu1  于 2023-01-15  发布在  Java
关注(0)|答案(1)|浏览(110)

作为一个新的程序员,我正在处理一个问题,这个问题告诉我如何将一个10个int的数组转换成一个格式化的字符串电话号码,如下所示:(999)999-9999。我遇到Matcher错误/问题。
我试着把整数数组转换成一个字符串,然后创建一个匹配器,捕获分组,把这个数字分成前3个、后3个和后4个,但我不断收到错误,我不知道到底是哪里出错了,代码如下:

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

public class Kata {
  
  private final static String pattern = "(?<first>[0-9][0-9][0-9])+(?<second>[0-9][0-9][0-9])+(?<third>[0-9][0-9][0-9][0-9])";
  private final static Pattern paddy = Pattern.compile(pattern); 
  
  public static Matcher match(String text){
        var mitch = paddy.matcher(text);
        mitch.find();
        return mitch;
  }//end method
  
  public static String createPhoneNumber(int[] numbers) {
    int space = 1;
    return String.format("(%s)" + space + "%s-%s", partOne(numbers), partTwo(numbers), partThree(numbers));  
  }//end method
  
  public static String partOne(int[] numbers){
    String phoneNumber = numbers.toString();
    return match(phoneNumber).group("first").strip();
  }//end method
    public static String partTwo(int[] numbers){
    String phoneNumber = numbers.toString();
    return match(phoneNumber).group("second").strip();
  }//end method
    public static String partThree(int[] numbers){
    String phoneNumber = numbers.toString();
    return match(phoneNumber).group("third").strip();
  }//end method
}`
kr98yfug

kr98yfug1#

为什么你需要一个正则表达式呢?你已经有了所有的数字,现在你需要把它们放入你的字符串中。你需要哪些成分呢?
1.一个方法,它接受一个整型数、一个偏移量和一个长度的数组。它将把这些整型数连接成一个字符串返回

  1. String.format调用,添加圆括号和连字符,并使用%s说明符插入数字部分。
    该方法可能如下所示:
String formatDigits(final int[] digits, final int offset, final int length) {
  final StringBuilder sb = new StringBuilder();
  for (int i = offset; i < offset + length; ++i) {
    sb.append(digits[i]);
  }
  return sb.toString();
}

然后你的字符串格式调用:

String.format(
        "(%s) %s-%s",
        formatDigits(numbers, 0, 3),
        formatDigits(numbers, 3, …),
        …);

如果为每个调用提供numbers会让人感觉重复,那么你是对的。为了避免这种情况,你可以引入一个类PhoneNumber,它期望构造函数中的int[] numbers数组将其存储在一个字段中。然后,它可以公开一个方法formatPhoneNumber(),该方法执行格式化并返回格式化的字符串。
强制性XKCD:https://xkcd.com/1171/(以及Jeff Attwood的博客:https://blog.codinghorror.com/regular-expressions-now-you-have-two-problems/,尽管与此问题的相关性较低)

相关问题