提问者:小点点

如何在Java中第一个和最后一个之间的所有数字出现之前立即向字符串添加字符?


情景

我在Java有一个程序,它随机输出如下文字:

1个蛋1只鸡2只鸭

2头牛,1只猪,1个鸡蛋和2只猫

1小时1只狗1只鸵鸟2头牛3只鸡

问题:

如何在字符串中的第一个和最后一个之间的所有数字出现之前立即添加逗号和空格? 也就是说,我该如何格式化这些字符串,使这些事例看起来如下所示:

1个鸡蛋,1只鸡和2只鸭

2头牛,1头猪,1个鸡蛋和2只猫

1辆拖拉机,1只狗,1只鸵鸟,2头牛和3只鸡

正如您将看到的,在每种情况下,I:

到目前为止我得到的是:

我已经让它成功地处理了下列情况:

1个对象:

1猫

2个对象:

2只猫

多个对象的变体:

3只猫和1只鸵鸟

1辆卡车和6个侏儒

我需要做的是:

  1. 标识是包含3个或更多数字的字符串。
  2. 如果是,跳过字符串中的第一个数字。
  3. 查找不是最后一个的下一个出现的数字。
  4. 添加“,”。

我可以成功地遍历该字符串并计算其中的数字:

    // count digits in string
    int digitsInString = 0;
    for (int i = 0, len = concatenatedValue.length(); i < len; i++) {
        if (Character.isDigit(concatenatedValue.charAt(i))) {
            digitsInString++;
        }
    }

    // if it only has < 3 digits, no formatting is needed
    if(digitsInString < 3) {
        return concatenatedValue;
    } else {
    //I've got to figure out what goes here
    }

有什么想法吗? 我现在只是通过将字符串拆分成一个char数组来编写它,但这似乎有点冗长和业余。 我想做一些效率更高的事情。


共1个答案

匿名用户

你可以这样做:

class Main {
  public static void main(String[] args) {
    String input = "1 hour1 dog1 ostrich 2 cows and 3 chickens";
    String output = input.replaceAll("(?<=[a-z]) ?(?<! and )(\\d+)", ", $1");
    System.out.println(output);
  }
}

返回:

1 hour, 1 dog, 1 ostrich, 2 cows and 3 chickens

模式匹配:

  • (?<=[a-z])-对a-z范围内的单个字符进行积极查找。
  • -匹配可选空格。
  • (?<;!and)-的负面查找。
  • (-打开第一个捕获组。
    • \d+-至少匹配一个数字(在Java中双转义)。
    • )-关闭第一个捕获组。

    我们替换为:

    • ,$1-逗号和空格文字以及在第一捕获组中捕获的任何内容。

    查看在线演示