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

Java 在不中断单词或忽略任何字符的情况下拆分字符串,java,regex,string,split,Java,Regex,String,Split,我正在尝试使用正则表达式将单个字符串拆分为多行。例如 (856587-A) 1806, LEBUH abcdef wref MUTIARA 14000 xxxx xxxxx xxxxxx, xxx.* 我想在每行中拆分32个字符 不从字符串中删除任何特殊字符 如果最后一个单词被剪切,请将其移动到下一行 通过使用相邻的代码,我能够实现以下结果 856587-A)1806,勒布阿布德夫西区 ef MUTIARA 14000 xxxxx xxxxx xxx xxx,xxx* 但是,它是从第一行中

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

(856587-A) 1806, LEBUH abcdef wref MUTIARA 14000 xxxx xxxxx xxxxxx, xxx.*
  • 我想在每行中拆分32个字符
  • 不从字符串中删除任何特殊字符
  • 如果最后一个单词被剪切,请将其移动到下一行
  • 通过使用相邻的代码,我能够实现以下结果

    • 856587-A)1806,勒布阿布德夫西区
    • ef MUTIARA 14000 xxxxx 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");
                }
    

    首先,将输入字符串拆分为“单词”。这可能很容易,也可能很难,具体取决于定义“单词”的方式。对于仅由任意数量的空格分隔的单词,类似这样的操作将很好地完成这项工作:

     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();
    }
    

    请尝试
    nfAddr=nfAddr.replaceAll(“.{30,}\\b[\\p{p}\\p{S}\\h]*”,“$0\n”);
    ,请参阅。另外,
    “{0,30}\\b[\\p{p}\\p{S}\\h]*”
    可能会有所帮助。可能会重复感谢。这对我来说非常有效,而不是regex:)