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

Java替换字符串中的初始字符并保留长度,java,regex,regexp-replace,Java,Regex,Regexp Replace,我正在寻找解决方案(Java),用相同数量的其他字符替换最初出现的多个字符,例如,如果“a”应替换为“-”,则比我预期的: aaabbaa -> ---bbaa aaxxaab -> --xxaab xaaaaax -> xaaaaax 我试过这样的方法: "aaabbaa".replaceAll( "^[a]+", "-") // -bbaa "aaabbaa".replac

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

aaabbaa  -> ---bbaa
aaxxaab  -> --xxaab
xaaaaax  -> xaaaaax
我试过这样的方法:

"aaabbaa".replaceAll( "^[a]+", "-")        // -bbaa
"aaabbaa".replaceAll( "(?=^[a]+)", "-")    // -aaabbaa
如果可能的话,我更喜欢regex或oneliner

你有什么提示吗

问候,,
安妮

使用
字符[]

char[] cs = str.toCharArray();
for (int i = 0; i < cs.length && cs[i] == 'a'; ++i) {
  cs[i] = '-';
}
String newStr = new String(cs);
char[]cs=str.toCharArray();
对于(int i=0;i
如果使用Java 9+,请将lambda重载用于
replaceAll

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支持lookback中的有限重复。您可以匹配一个断言,从字符串开始的左边的内容仅为a

使用
-

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

同意。这种情况会停止for循环。但老实说:解决这个问题的方法太可怕了。完美的解决方案!我想,这也是可以的:“aaabbbaaa”.replaceAll((?@AnnieW)。我已经测试过它,它也可以根据
工作。为了正确性和性能,我们建议您在Java 6到13中只使用具有较低上限的量词。
System.out.println("aaabbaa".replaceAll("(?<=^a{0,100})a", "-"));
---bbaa