3
 String original = "This is a sentence.Rajesh want to test the application for the word split.";
 List matchList = new ArrayList();
 Pattern regex = Pattern.compile(".{1,10}(?:\\s|$)", Pattern.DOTALL);
 Matcher regexMatcher = regex.matcher(original);
 while (regexMatcher.find()) {
     matchList.add(regexMatcher.group());
 }
 System.out.println("Match List "+matchList);

テキストを解析して、長さが 10 文字を超えず、行末に改行があってはならない行の配列にする必要があります。

私はシナリオで以下のロジックを使用しましたが、行末に改行がある場合、10 文字の後に最も近い空白に解析されるという問題があります

例:実際の文は「これは文です。ラジェッシュは単語分割のアプリケーションをテストしたいです。」しかし、ロジックの実行後は次のようになります。

一致リスト [これは , nce.Rajesh です , したい , テスト , アプリケーション , の , 単語 , 分割.]

4

3 に答える 3

2

この質問は、ある時点で Groovy としてタグ付けされました。Groovy の回答がまだ有効であり、複数の空白 (' ' など) を保持する心配がない場合:

def splitIntoLines(text, maxLineSize) {
    def words = text.split(/\s+/)
    def lines = ['']
    words.each { word ->
        def lastLine = (lines[-1] + ' ' + word).trim()
        if (lastLine.size() <= maxLineSize)
            // Change last line.
            lines[-1] = lastLine
        else
            // Add word as new line.
            lines << word
    }
    lines
}

// Tests...
def original = "This is a sentence. Rajesh want to test the application for the word split."

assert splitIntoLines(original, 10) == [
    "This is a",
    "sentence.",
    "Rajesh",
    "want to",
    "test the",
    "application",
    "for the",
    "word",
    "split."
]
assert splitIntoLines(original, 20) == [
    "This is a sentence.",
    "Rajesh want to test",
    "the application for",
    "the word split."
]
assert splitIntoLines(original, original.size()) == [original]
于 2012-05-22T20:22:21.960 に答える
1

重量を引っ張らないので、正規表現を避けました。このコードは単語をラップし、1つの単語が10文字を超える場合は、それを壊します。また、余分な空白も処理します。

import static java.lang.Character.isWhitespace;

public static void main(String[] args) {
  final String original =
    "This is a sentence.Rajesh want to test the application for the word split.";
  final StringBuilder b = new StringBuilder(original.trim());
  final List<String> matchList = new ArrayList<String>();
  while (true) {
    b.delete(0, indexOfFirstNonWsChar(b));
    if (b.length() == 0) break;
    final int splitAt = lastIndexOfWsBeforeIndex(b, 10);
    matchList.add(b.substring(0, splitAt).trim());
    b.delete(0, splitAt);
  }
  System.out.println("Match List "+matchList);
}
static int lastIndexOfWsBeforeIndex(CharSequence s, int i) {
  if (s.length() <= i) return s.length();
  for (int j = i; j > 0; j--) if (isWhitespace(s.charAt(j-1))) return j;
  return i;
}
static int indexOfFirstNonWsChar(CharSequence s) {
  for (int i = 0; i < s.length(); i++) if (!isWhitespace(s.charAt(i))) return i;
  return s.length();
}

プリント:

Match List [This is a, sentence.R, ajesh, want to, test the, applicatio, n for the, word, split.]
于 2012-05-22T13:13:18.180 に答える