将 char 放入每个 N 个字符的 java 字符串中

2022-09-01 09:09:33

我有一个java字符串,它有一个可变的长度。

我需要把这首曲子放进字符串中,说每10个字符。"<br>"

例如,这是我的字符串:

`this is my string which I need to modify...I love stackoverlow:)`

如何获取此字符串?

`this is my<br> string wh<br>ich I nee<br>d to modif<br>y...I love<br> stackover<br>flow:)`

谢谢


答案 1

尝试:

String s = // long string
s.replaceAll("(.{10})", "$1<br>");

编辑:以上工作...大多数时候。我一直在玩它,遇到了一个问题:由于它在内部构造了一个默认模式,因此它会在新行符上停止。要解决这个问题,你必须以不同的方式写它。

public static String insert(String text, String insert, int period) {
    Pattern p = Pattern.compile("(.{" + period + "})", Pattern.DOTALL);
    Matcher m = p.matcher(text);
    return m.replaceAll("$1" + insert);
}

敏锐的读者会发现另一个问题:您必须在替换文本中转义正则表达式特殊字符(如“$ 1”),否则您将获得不可预测的结果。

我也很好奇,并将这个版本与上面的Jon进行了基准测试。这个速度慢一个数量级(60k文件上的1000个替换需要4.5秒,他的需要400ms)。在 4.5 秒中,只有大约 0.7 秒实际构建了模式。其中大部分是在匹配/替换上,所以它甚至没有导致自己进行这种优化。

我通常更喜欢不那么冗长的解决方案。毕竟,更多的代码=更多的潜在错误。但在这种情况下,我必须承认,Jon的版本——这实际上是天真的实现(我的意思是以一种好的方式)——要好得多。


答案 2

像这样:

public static String insertPeriodically(
    String text, String insert, int period)
{
    StringBuilder builder = new StringBuilder(
         text.length() + insert.length() * (text.length()/period)+1);

    int index = 0;
    String prefix = "";
    while (index < text.length())
    {
        // Don't put the insert in the very first iteration.
        // This is easier than appending it *after* each substring
        builder.append(prefix);
        prefix = insert;
        builder.append(text.substring(index, 
            Math.min(index + period, text.length())));
        index += period;
    }
    return builder.toString();
}