1

私は現在、このコードを使用して行を20文字に制限しています。

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

ただし、次のような単語は壊れます。

Hello, my name is Pa
trick

どうすればこれを防ぐことができますか?

4

3 に答える 3

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ではなく文字を検索していました。私の例では、文字列はaで終わりました.が、あなたのものではありませんでした。\W上記の正規表現を編集して、文字列の最後に。を使用して条件を追加することにより、文字列がで表されていない文字で終了する場合にも機能するようにしました$

ここで実行可能な例を見ることができます:http://ideone.com/Nw2aNr

于 2012-12-05T17:01:33.573 に答える
3

文字列をスペースで分割しs.split("\\s+")、行の長さを監視しながら単語ごとに追加します。

于 2012-12-05T16:56:33.387 に答える
1

これは、文字が追加されるたびに発生するコードの一部だと思います。したがって、これを修正するには、さらに興味深いことを行う必要があります。基本的な考え方は次のとおりです。

  1. 回線制限が検出されました。
  2. その最後の行を取ります。
  3. を使用して空白で分割するString words[] = line.split("\\s+");
  4. 複数の単語がある場合は、
    • を使用してその行の部分文字列を取得lastIndexOf(words[words.length - 1]);します。これにより、最後の単語を除くすべてが保持されます。
    • その最後の単語を新しい行に追加します。
  5. それ以外の場合は、今と同じように単語を区切ります(改行を追加します)
于 2012-12-05T17:02:36.490 に答える