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

Posted

技术标签:

【中文标题】Java替换String中的初始字符并保留长度【英文标题】:Java replace initial characters in String and preserve length 【发布时间】:2020-12-04 09:36:29 【问题描述】:

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

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

我尝试过类似的方法:

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

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

你有什么提示吗?

问候, 安妮

【问题讨论】:

【参考方案1】:

Java 支持后视中的有限重复。您可以匹配一个断言,从字符串开头开始左侧的内容只是一个。

在替换中使用-

(?<=^a1,100)a

Regex demo | Java demo

例如

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

输出

---bbaa

【讨论】:

完美解决方案!我想,这也可以: "aaabbbaaa".replaceAll( "(? @AnnieW。我已经对其进行了测试,并且也可以使用 ideone.com/npPlMN 根据this page ..for both correctness and performance, we recommend you only use quantifiers with a low upper bound in lookbehind with Java 6 through 13.【参考方案2】:

如果使用 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
    

【讨论】:

【参考方案3】:

使用char[]

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

String newStr = new String(cs);

【讨论】:

同意。该条件停止 for 循环。但老实说:解决这个问题的方法太可怕了。

以上是关于Java替换String中的初始字符并保留长度的主要内容,如果未能解决你的问题,请参考以下文章

java问题:String字符串替换部分空格,保留特定空格,如何做?

java中的string类中内容一旦被初始化就不能改变为啥还有replace方法呢?

java中怎么将字符串数组中的重复的元素去掉,但是还是保留一个。

如何判断string字符串的长度

java 替换文本中的所有指定的字符串,比如#*替换为sq, #**替换为we, 我使用了replaceAll进行的替换

Python字符串处理:过滤字符串中的英文与符号,保留汉字