2012-03-12 5 views
6

長さが50文字を超えない文字配列を解析する必要がある長い文字列があります。これは私にとっては難しい部分ですが、正規表現は単語を途切れさせたくないので、文字列間をきれいにするために50文字前に最後の空白があることを確認しています。指定された長さの後にテキストが分割されますが、grailsを使用して単語が区切られません。

public List<String> splitInfoText(String msg) { 
    int MAX_WIDTH = 50; 
    def line = [] String[] words; 
    msg = msg.trim(); 
    words = msg.split(" "); 
    StringBuffer s = new StringBuffer(); 
    words.each { 
     word -> s.append(word + " "); 
     if (s.length() > MAX_WIDTH) { 
      s.replace(s.length() - word.length()-1, s.length(), " "); 
      line << s.toString().trim(); 
      s = new StringBuffer(word + " "); 
     } 
    } 
    if (s.length() > 0) 
     line << s.toString().trim(); 
    return line; 
} 
+0

あなたの入力と期待される出力を提供しますか? – anubhava

+0

公開リスト splitInfoText(文字列msg){ \t \t int MAX_WIDTH = 50; \t \t \t \t DEFライン= [] \t \t \t \tのString []の単語; msgstr(); msg32 \t \t \t \t words = msg.split( ""); \t \t \t \t StringBuffer s = new StringBuffer(); \t \t \t \t words.each {ワード - > \t \t \t \t \t s.append(ワード+ "「)。 \t \t \t \t \t \t IF(s.length()> MAX_WIDTH){ \t \t \t \t \t \t \t s.replace(s.length() - word.length() - 1、s.length( )、 ""); \t \t \t \t \t \t \t \t線<< s.toString()() \t \t \t \t \t \t \t \t S =新しいStringBufferの(単語+を "「)トリム。 \t \t \t \t \t \t \t} \t \t \t \t \t} \t \t \t \t IF(s.length()> 0) \t \t \t \t \t線<< s.toString()。trim() \t \t \t \t \t return line; \t \t \t – Nimmy

+0

@Nimmy:質問の本体にコードを挿入しようとしましたが、自分で質問を編集してコードを入力すると、はるかに良くなります。 – PearsonArtPhoto

答えて

5

これを試してみてください:

List<String> matchList = new ArrayList<String>(); 
Pattern regex = Pattern.compile(".{1,50}(?:\\s|$)", Pattern.DOTALL); 
Matcher regexMatcher = regex.matcher(subjectString); 
while (regexMatcher.find()) { 
    matchList.add(regexMatcher.group()); 
} 
+0

テストしたところ、これは私にとってはうまくいかなかった。 – JRSofty

+0

@JRSofty: 'matchList'パラメータを初期化するのを忘れました - それは今動作しますか?そして、そうでなければ、まさに問題は何ですか? –

+0

これで動作します。オリジナルは空白を捕捉したが、1単語を除いてテキストを捕捉しなかった。これは私が期待するように動作します。 – JRSofty

4

私はティムの答えのGroovierバージョンを信じている:

List matchList = (subjectString =~ /(?s)(.{1,50})(?:\s|$)/).collect { it[ 1 ] } 
+0

Groovyはまったく分かりませんが、これは私にとってとても魅力的です。 +1 :) –

関連する問題