在不中断单词或不忽略任何字符的情况下拆分字符串

时间:2018-11-28 11:35:58

标签: java regex string split

我正在尝试使用正则表达式将单个字符串分成多行。例如

(856587-A) 1806, LEBUH abcdef wref MUTIARA 14000 xxxx xxxxx xxxxxx, xxx.*
  1. 我想在每一行中分割32个字符。
  2. 不从字符串中删除任何特殊字符。
  3. 如果最后一个单词被剪掉,请将其移至下一行。

使用附加的代码,我可以实现以下结果。

  • 856587-A)1806年,LEBUH abcdef wr
  • ef MUTIARA 14000 xxxx xxxxx xxx
  • xxx,xxx。*

但是,它是从第一行中删除'(',将最后一个单词打断,然后将其移动到下一行。

String nfAddr = "(856587-A) 1806, LEBUH abcdef wref MUTIARA 14000 xxxx xxxxx xxxxxx, xxx.*";

Pattern pn = Pattern.compile("\\w.{1," + (30) + "}");
Matcher mn = pn.matcher(nfAddr);
while (mn.find()) {
                nfAddr = nfAddr + (mn.group()+"\n");
            }

1 个答案:

答案 0 :(得分:0)

首先将输入字符串分解为“单词”。根据定义“单词”的方式,这可能很容易,也可能很困难。对于仅由任意数量的空格分隔的单词,类似以下内容将很好地完成工作:

 String[] words = nfAddr.split("\\s+");

现在您已经有了各个单词,将它们重新组合成所需的最大长度的行,在它们之间添加空格,然后将得到的行与它们之间的换行符串在一起。这是执行此操作的简单例程的示例:

static public String formatParagraph(String text, int maxWidth)
{
    String[] words = text.split("\\s+");

    StringBuilder pp = new StringBuilder();
    StringBuilder line = new StringBuilder();
    for (String w : words) {
        if (line.length() + w.length() + 1 > maxWidth) {
            if (pp.length() > 0) {
                pp.append(System.lineSeparator());
            }
            pp.append(line.toString());
            line.setLength(0);
        }
        if (line.length() > 0) {
            line.append(' ');
        }
        line.append(w);
    }
    if (line.length() > 0) {
        if (pp.length() > 0)
            pp.append(System.lineSeparator());
        pp.append(line);
    }
    return pp.toString();
}