【问题标题】:Java - parse String and add Line break every 100 characters [duplicate]Java - 解析字符串并每 100 个字符添加换行符 [重复]
【发布时间】:2012-05-18 19:05:28
【问题描述】:

我想问如何解析字符串并每 100 个字符添加一个换行符 (\n)。 我知道您可以使用正则表达式解析字符串,但不知道以后如何进行。有人可以帮忙吗?

【问题讨论】:

  • 将您拥有的代码发布给我们,我们将从那里为您提供帮助。

标签: java regex


【解决方案1】:

字符串不需要通过正则解析,直接拆分即可。

String s = "your very long String";
String[] splited = new String[s.size() / 100 + 1];
for (int i = 0; i < splited.length(); i++) {
  splited[i] = s.subString(0, 100);
  s = s.subString(100);
}

编辑

StringBuilder sb = new StringBuilder();
for(int i = 0; i< splited.size(); i++) {
  sb.append(splited[i]);
  sb.append("\n");
}
String stringWithNewLines = sb.toString();

【讨论】:

  • 拆分然后呢?如何添加新行并稍后加入?
  • 你测试你的代码了吗?我仍然可以看到(更新后的代码)您从未放置过\n,也没有按照 OP 的要求进行操作。
  • 我将子字符串保存在一个数组中。重新组合它并添加换行符几乎是微不足道的,但我编辑了我的答案。
【解决方案2】:

我认为这比 % 100 和重复附加要快一些

function(String input) {
    // array represantation of the String
    final char[] inputArray = input.toCharArray();
    // same length + amount of newlines (i.e. length / 100)
    final char[] outputArray = new char[inputArray.length + (inputArray.length/100)];
    int i = 0;
    int o = 0;
    while(i < inputArray.length) {
        // copy every 100th substring
        System.arraycopy(inputArray,i,outputArray,o,100);
        i += 100;
        o += 101;
        outputArray[o] = '\n';
    }
    // copy rest
    if(i < inputArray.length) {
        System.arraycopy(inputArray,i,outputArray,o,inputArray.length-i);
    }
    return(outputArray.toString());
}

虽然未经测试

【讨论】:

  • 那么您认为它是bit faster than % 100 的假设是没有根据的并且是错误的如果它没有经过测试并与这里的其他解决方案进行比较,或者您可能知道。
  • 好吧,我说我认为不是这样。由于 op 想要一个正则表达式解决方案,而我的答案只是另一种选择,我认为没有必要进行测试。我只是想暗示,而不是冒犯
【解决方案3】:

因为您不能在 Java 中向常规 String 添加更多字符。您应该使用StringBuffer 来执行此操作。

您可以使用 for 循环遍历字符串,然后在每 100 个字符之后循环:

String string = "Some long string ...";
StringBuffer buffer = new StringBuffer();

for(int i = 0; i < string.length(); i++) {
    // Append a \n after every 100th character.
    if((i > 0) && (i % 100) == 0) {
        buffer.append("\n");
    }
    // Just adds the next character to the StringBuffer.
    buffer.append(string.charAt(i));
}

String parsedString = buffer.toString();

【讨论】:

  • 它将在i = 0 处添加一个\n。看我的帖子。
  • 愚蠢的我,谢谢你的评论。
  • 为什么要遍历每个i 并一次添加一个字符?一次添加一个完整的块不是更容易吗? (见我的帖子)
  • 没想到这么快。不错。
【解决方案4】:

我建议使用 StringBuilder。它很高效,可以完全适合您的任务。

String originalString = ... ;

// The new length of the string is
int newLength = originalString.length() +(int) Math.ceil ( originalString.length() / 100.0 );

StringBuilder builder = new StringBuilder ( newLength );

我将字符串的每 100 个字符部分称为一个“块”,以便于查看发生了什么。

int chunkStart = 0;

while ( chunkStart < originalString.length() )
{
    // We find the index of the end of the chunk.
    int endOfThisChunk = Math.min ( chunkStart + 100, originalString.length() );

    // and this chunk to builder
    builder.append ( originalString.substring( chunkStart, endOfThisChunk ) );

    // append the new line character
    builder.append ( '\n' );

    // set the next spot for chunkStart
    chunkStart = endOfThisChunk;
}

return builder.toString();

希望对您有所帮助!如果您需要更多解释,请告诉我!

【讨论】:

    【解决方案5】:

    可以试试这个吗?

    String stringToParse = "abcde";
    
    for(int i = 0; i < stringToParse.size(); i = i + 100){
       stringToParse = ((StringBuffer) stringToParse ).insert(i, "\n").toString();
    }
    

    【讨论】:

    • 这绝对是错误的,您只是用索引i 处的\n 替换字符。此外,Java String 不能被索引。
    • OP 没有尝试修改原始数据。这不起作用。
    • 我应该在打字之前把眼睛里的睡意洗干净!现在编辑答案。
    • 你能隐式地从 String 转换为 StringBuffer 吗?
    • 会造成很多开销。创建一个 StringBuffer(或更好的 StringBuilder)并插入换行符;然后转换回字符串
    【解决方案6】:

    很简单:

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < str.length(); i++) {
        if (i > 0 && (i % 100 == 0)) {
            sb.append("\n");
        }
    
        sb.append(str.charAt(i));
    }
    
    str = sb.toString();
    

    【讨论】:

    • 不错的一个。我做了一个稍微不同的方法,它不会遍历每个索引。
    【解决方案7】:

    你可以这样做:

    String str = "....";
    String parsedStr = str.replaceAll("(.{100})", "$1\n");
    

    这会将每 100 个字符替换为相同的 100 个字符,并在末尾添加一个新行。

    (.{100}) 将捕获一组 100 个字符。第二个中的$1 将放群组的内容。然后\n 将附加到刚刚匹配的 100 个字符中。

    【讨论】:

    • 很奇怪,以前从未想过……确实很聪明。
    • 非常聪明的解决方案。 +1 我喜欢。
    • 不错的解决方案。我真的应该花一些时间来理解正则表达式...+1
    • @TheEliteGentleman:几个月前我才想出来,我想我是第一次在 SO 上看到它。
    • @T.Grottker:感谢您的评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 2015-10-22
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多