2012-05-22 1 views
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 символов, если есть перерыв в конце строки

для, например: Фактическое предложением является "Это предложение.Rajesh хочет протестировать приложение для разделения слов. «Но после выполнения логики его получение, как показано ниже.

Список Match [Это, nce.Rajesh, хочет, протестировать, РИМЕНЕНИЕ, для, слов, раскола.]

+0

Предполагая, что вы хотите, это в Groovy? Вы не упоминаете Groovy отдельно от тега ... –

+1

Вы имеете в виду, что 10-й символ не должен быть ? Что, если это пространство? – JHS

+1

Что происходит, если есть слово длиной более 10 символов? Должен ли он быть разделен посередине? Например, нужно «quickbrownfoxjumpsoverthelazydog» «стать» {«quickbrown», «foxjumpsov», «erthelazyd», «og»} '? – dasblinkenlight

ответ

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.] 
+0

Мое требование: мне нужно ограничить количество символов в 1 строке меньше или равно 100 символам, не нарушая слово. Если слово в конце 100 символов нарушается, нам нужно добавить это слово в следующую строку – Raja

1

Этот вопрос был помечен, как 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] 
4

ОК, так что мне удалось получить следующую работу, с максимальной длиной строки 10, но и расщепление слов, которые длиннее 10!

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

Это результат:

This is a 
sentence. 
Rajesh want 
to test 
the 
applicatio 
ns word 
split 
handling. 
+0

, если вы хотите включить разрывы строк, то: «(. {1,10} (?: \\ s \\ n | $)) | (. {0,10})" – Rafe

+0

Это здорово использовать регулярное выражение ! но трудно добавить «-» между сломанными словами ... – Valen

+0

извините, я не понимаю? – Rafe

 Смежные вопросы

  • Нет связанных вопросов^_^