Текст разделяется после указанной длины, но не разбивает слова с помощью граалей - PullRequest
6 голосов
/ 12 марта 2012

У меня есть длинная строка, которую мне нужно проанализировать в массив строк, длина которых не превышает 50 символов. Самое сложное в этом для меня - убедиться, что регулярное выражение находит последний пробел перед 50 символами, чтобы сделать чистый разрыв между строками, поскольку я не хочу, чтобы слова обрезались.

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; 
}

Ответы [ 2 ]

6 голосов
/ 12 марта 2012

Попробуйте это:

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());
}
4 голосов
/ 12 марта 2012

Я верю, что ответ Тима на Groovier:

List matchList = ( subjectString =~ /(?s)(.{1,50})(?:\s|$)/ ).collect { it[ 1 ] }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...