用空格替换数字的数量

4

我有一个字符串:

String example = "AA5DD2EE3MM";

我想要用空格替换数字。例如:
String example = "AA     DD  EE   MM"

如果字符串会
String anotherExample = "a3ee"

应该变成:

String anotherExample = "a   ee"

我希望能够对任意字符串执行此操作,而不仅仅是上面的示例。


5
你尝试过任何事情吗? - Reimeus
从一个名为result的空字符串开始。循环遍历example字符串中的每个字符。检查该字符是否为数字。如果不是数字,则将该字符附加到result。如果是数字,则运行一个新的循环,将相应数量的空格附加到result。这应该是至少处理从0到9转换为空格的数字的开始。尝试编写一些代码,并回答有关该代码的问题。 - nos
A11A 是 2 个空格还是 11 个空格? - zysaaa
5个回答

8

将输入字符串按数字和非数字字符分割成流,使用String.repeat将数字映射到相应数量的空格,使用Collectors.joining()收集字符串:

String input  = "AA5DD2EE3MM";
String regex  = "(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)";
String result = Pattern.compile(regex)
                        .splitAsStream(input)
                        .map(s -> s.matches("\\d+") ? " ".repeat(Integer.parseInt(s)) : s)
                        .collect(Collectors.joining());

1
我认为你可以简化你的正则表达式为\d+,但对于你紧凑的方法表示赞赏。 - Tim Biegeleisen
看起来不错。我喜欢简洁的方法! - QBrute

2
您也可以使用这种方法,它更简单但也远不如优雅:
String example = "a4aa";
String newString = "";

for (int i = 0; i < example.length(); i++) {
    if (Character.isDigit(example.charAt(i))) {
        for (int a = 0; a < Character.getNumericValue(example.charAt(i)); a++) {
            newString += " ";
        }
    } else {
        newString += example.charAt(i);
    }
}
System.out.println(newString);

我建议使用Character.getNumericValue(char)代替Integer.parseInt(String),这样你可以直接在char上使用它,而不必创建另一个String。此外,考虑从代码中删除所有空行,这将大大提高可读性。 - maloomeister
@maloomeister 这绝对是更好的方式,我刚刚改了它。 - mousekip

1
使用模式匹配器方法:
String input = "AA5DD2EE3MM";
Pattern pattern = Pattern.compile("\\d+");
Matcher m = pattern.matcher(input);
StringBuffer buffer = new StringBuffer();

while (m.find()) {
    m.appendReplacement(buffer,new String(new char[Integer.valueOf(m.group())]).replace("\0", " "));
}
m.appendTail(buffer);
System.out.println(buffer.toString());  // AA     DD  EE   MM

这里的想法是迭代字符串,在每个数字匹配处暂停。我们用与数字相同次数复制的空格替换每个数字。

1
public static String replaceDigitsWithSpaces(String input) {
    String result = "";
    int len = input.length(), i =0;
    
    while( i < len) {
        
        if(Character.isLetter(input.charAt(i))) {
            result += input.charAt(i);
        }else if(Character.isDigit(input.charAt(i))) {
            //generate number upto characters
            int k = 0, j = i;
            String temp = "";
            while(j < len) {
                if(Character.isDigit(input.charAt(j))) {
                    temp += input.charAt(j);
                    j++;
                }else {
                    break;
                }
            }
            k = Integer.parseInt(temp);
            while(k != 0) {
                result+= " ";
                k--;
            }
            i = j;
            continue;
        }
        i++;
    }
    return result;
}

input:: "AA23BB1C11C8"<br>
output:: AA                       BB C           C        .

0

StringBuilder 在字符串拼接时更加高效:

    public static String spaceIt(String s) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (Character.isDigit(c)) {
                for (int j = 0; j < Character.digit(c, 10); j++) {
                    sb.append(' ');
                }
            } else {
                sb.append(c);
            }
        }
        return sb.toString();
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接