【问题标题】:Java String Wrapping:How do I wrap words in a String at New line character(\n)Java 字符串换行:如何在换行符处将单词换行(\n)
【发布时间】:2016-11-03 21:40:32
【问题描述】:

我们想在换行符(\n)处将单词换行。基本上,我们按 ENTER 开始新行。

这是 Enter 键,按下时在我们的消息中创建一个新行。

输入数据:

字符串在注释列中被捕获。 给出的评论栏是:

EDI ORDER-SAVE COMMENTS\nC3 Generic\nLOC 0833\nExpected arrival 01/07/2016\nOTYPE NE\nTRKPC 01 GM/00007643020008361321

我们试过了:

string s = "EDIORDER-SAVE COMMENTS C3 Generic LOC 0833 Expected arrival 01/07/2016  OTYPE NE TRKPC 01 GM/00007643020008361321"  ;

StringBuilder sb = new StringBuilder(s);

int i = 0;
while ((i = sb.indexOf(" ", i + 20)) != -1) {
    sb.replace(i, i + 1, "\n");
}

转换后的预期数据: linebreak 是换行符

Long  String of Comment field  should Splits in 6 different lines 

EDI ORDER-SAVE COMMENTS

C3 Generic

LOC 0833

Expected arrival 01/07/2016

OTYPE NE

TRKPC 01 GM/00007643020008361321

输出后的确切数据如下所示:

SalesOrder    NComment                            SalesOrderLine                    StockCode
183590  EDI ORDER-SAVE COMMENTS                         1                                 
183590                                                  2                         abc-defg-13OZ-24              
183590  C3    Generic                                   37                                
183590  LOC 0833                                        38                                
183590  Expected arrival               01/07/2016       39                                
183590  OTYPE NE                                        40                                
183590  TRKPC 01 GM/00007643020008361321                51

任何帮助将不胜感激!

【问题讨论】:

  • 分割标准是什么?不能是“”,因为这个字符也存在于“LOC 0833”的中间。
  • 以换行符 (\n) 宽度字符分割。最大宽度长度为 20。
  • 如果 "\n" 不是 s 则不能作为分割标准,所以它必须是一定的长度(或长度),或者另一个字符。
  • 我们想实现这个java代码:paste.ofcode.org/S4LEQM2RpEcre3PcYnbpxC如果可能的话,我们想用\n替换每个行空间。
  • 你的 6 行输出是不可能的...

标签: java regex string conditional newline


【解决方案1】:

抱歉,我并没有真正得到你想要实现的目标。您想在超过第 20 个字符的单词之前插入换行符吗?

    StringBuilder sb = new StringBuilder(s);
    int currentSpaceFound = sb.indexOf(" ");
    int i = 1;
    while (currentSpaceFound != -1) {
        int lastOccurence = currentSpaceFound;
        currentSpaceFound = sb.indexOf(" ", currentSpaceFound + 1);
        if (currentSpaceFound > (20 * i)) {
            sb.setCharAt(lastOccurence, '\n');
            i++;
        }
    }
    System.out.println(sb);

【讨论】:

  • 是的,我们想在通过第 20 个字符的单词之前插入 breakIterator。输出应拆分为示例中提到的 6 行。
  • 我们想实现这个java程序:paste.ofcode.org/S4LEQM2RpEcre3PcYnbpxC
  • 你的意思是第 6 行的内容是错误的:它符合标准。如果我对此的解释有误,请纠正我。
  • 但是您的六行解决方案是错误的,不是吗?例如,EDI ORDER-SAVE COMMENTS 有 24 个字符,应该在 EDI ORDER-SAVE 之后中断?
  • 第一行应该是 EDI ORDER-SAVE COMMENTS
【解决方案2】:

我认为这样的事情应该可行:

private String wrapComment(String comment, int length) {

    if(comment.length() <= length) return comment;

    StringBuilder stringBuilder = new StringBuilder(comment);

    int spaceIndex = -1;

    for(int i = 0; i < comment.length(); i ++) {

        if(i % length == 0 && spaceIndex > -1) {
            stringBuilder.replace(spaceIndex, spaceIndex+1, "\n");
            spaceIndex = -1;
        }

        if(comment.charAt(i) == ' ') {
            spaceIndex = i;
        }

        stringBuilder.append(comment.charAt(i));
    }

    return stringBuilder.toString();
}

测试:

String comment = "EDI ORDER-SAVE COMMENTS C3 Generic LOC 0833 Expected arrival 01/07/2016  OTYPE NE TRKPC 01 GM/00007643020008361321";
System.out.println(wrapComment(comment, 30));

输出:

EDI ORDER-SAVE COMMENTS C3
Generic LOC 0833 Expected
arrival 01/07/2016  OTYPE NE TRKPC
01 GM/00007643020008361321

【讨论】:

  • 是的,它看起来很近似。但我已经给出了预期的数据输出。它只会给出 6 行。
  • 我们想实现类似这样的换行:paste.ofcode.org/S4LEQM2RpEcre3PcYnbpxC 如果可能的话,我们想用 \n 替换每个行空间
  • 你的意思是你想在每一行之后再换行?
  • 我想说当这个长字符串拆分时,它应该像这样保存在 sql 数据库中。 paste.ofcode.org/KbgzFqYqUUaSGpTQFgarWh 正好在 6 个新行中。
  • 我们在换行符处有换行符。然后可以对 ex 进行 6 行拆分: aa\nbb\ncc\ndd\nee\nff
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多