Java 替换字符串中的初始字符并保留长度

Java replace initial characters in String and preserve length

我正在寻找解决方案 (Java) 以用相同数量的其他字符替换最初出现的多个字符,例如,如果 'a' 应替换为“-”,超出我的预期:

aaabbaa  -> ---bbaa
aaxxaab  -> --xxaab
xaaaaax  -> xaaaaax

我尝试过类似的方法:

"aaabbaa".replaceAll( "^[a]+", "-")        // -bbaa
"aaabbaa".replaceAll( "(?=^[a]+)", "-")    // -aaabbaa

如果可能的话,我更喜欢regex或者oneliner。

你有什么提示吗?

此致, 安妮

使用 char[]:

char[] cs = str.toCharArray();
for (int i = 0; i < cs.length && cs[i] == 'a'; ++i) {
  cs[i] = '-';
}
String newStr = new String(cs);

如果使用 Java 9+,请对 replaceAll 使用 lambda 重载:

import java.util.regex.Pattern;

class Main {
    public static void main(String[] args) {
        String res = Pattern
            .compile("^a+")
            .matcher("aaabbb")
            .replaceAll(m -> "-".repeat(m.group().length()));
        System.out.println(res); // => ---bbb
    }
}

Java 支持 lookbehind 中的有限重复。您可以匹配 a 断言字符串开头左边的内容只有 a。

在替换中使用-

(?<=^a{1,100})a

Regex demo | Java demo

例如

System.out.println("aaabbaa".replaceAll("(?<=^a{0,100})a", "-"));

输出

---bbaa