限制线宽而不切割单词

时间:2012-12-05 16:53:05

标签: java

我目前使用此代码将行限制为20个字符:

if (string.length() % 20 == 0 && string.length() >= 20) {
    this.string += "\n";
}

然而,它打破了这样的话:

Hello, my name is Pa
trick

我该如何防止这种情况?

3 个答案:

答案 0 :(得分:9)

您可以使用此.{1,20}(\W|$)这样的正则表达式来分割接近20个字符的短语,但不会分割单词。

这将最多20个字符。如果您要配置数字,可以在正则表达式中对其进行参数化,例如"(.{1," + max + "}(\\W|$))",其中max是您的限制。

String s = "Hello, my name is Patrick and I have a lot to say, but I will tell you that another day.";
Matcher m = Pattern.compile("(.{1,20}(\\W|$))").matcher(s);
StringBuilder b = new StringBuilder();
while (m.find()) {
    b.append(m.group()).append("\n");
}
System.out.println("-> " + b.toString());

将打印出来:

-> Hello, my name is 
Patrick and I have a 
lot to say, but I 
will tell you that 
another day.

修改

我编辑了上面的答案,实际上它正在搜索一个不在单词\W中的字符,在我的例子中,字符串以.结尾但不在你的字符中。我编辑了上面的正则表达式,这样如果字符串以\W中没有表示的字符结尾,并在$的字符串末尾添加条件,它也会起作用。

您可以在此处看到一个可运行的示例:http://ideone.com/Nw2aNr

答案 1 :(得分:3)

s.split("\\s+")的空格拆分一个字符串,然后逐字逐句追加该行的长度。

答案 2 :(得分:1)

我想这是每次附加字符时的一段代码。所以,要解决这个问题,你应该做一些更有趣的事情。基本思路是:

  1. 检测到线路限制。
  2. 拿最后一行。
  3. 使用String words[] = line.split("\\s+");
  4. 拆分空白
  5. 如果你有多个单词,那么
    • 使用lastIndexOf(words[words.length - 1]);获取该行的子字符串,这样就可以保留除最后一个字之外的所有内容。
    • 将最后一个单词添加到新行。
  6. 否则,像现在这样断开这个词(通过添加换行符)