2012-03-12 10 views
6

Mam długi ciąg, który muszę przeanalizować w tablicy ciągów, które nie przekraczają 50 znaków długości. Najtrudniejszą częścią tego dla mnie jest upewnienie się, że regex znajduje ostatnie spacje przed 50 znakami, aby zrobić czysty podział między ciągami znaków, ponieważ nie chcę, aby słowa zostały obcięte.Podziel tekst po określonej długości, ale nie łam się słów za pomocą 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

Podaj swoje wejście i wyjście oczekiwany? – anubhava

+0

publiczna lista splitInfoText (String msg) { \t \t int MAX_WIDTH = 50; \t \t \t \t linii def = [] \t \t \t \t łańcuchowe [] słowa; \t \t \t msg = msg.trim(); \t \t \t \t słowa = msg.split (""); \t \t \t \t StringBuffer s = new StringBuffer(); \t \t \t \t words.each {słowo -> \t \t \t \t \t s.append (słowo + "„); \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 linia << s.toString() przycinania() \t \t \t \t \t \t \t \t s = nowy StringBuffer (słowo "+„); \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 linia << s.toString().trim() \t \t \t \t \t powrót do linii; \t \t } – Nimmy

+0

@Nimmy: Próbowałem umieścić twój kod w głównej części pytania, ale będzie wyglądał znacznie lepiej, jeśli sam edytujesz swoje pytanie i wprowadzisz swój kod. – PearsonArtPhoto

Odpowiedz

5

Spróbuj tego:

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

To nie działało dla mnie, gdy testowałem. – JRSofty

+0

@JRSofty: Zapomniałem zainicjować parametr 'matchList' - czy to działa teraz? A jeśli tak nie jest, jaki jest dokładnie problem? –

+0

Teraz działa. Oryginał przechwycił białe spacje, ale nie tekst, z wyjątkiem jednego słowa. Działa to tak, jak bym tego oczekiwał. – JRSofty

4

wierzę Groovier wersja odpowiedź Tima jest:

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

W ogóle nie znam Groovy'ego, ale dla mnie wygląda to bardzo groźnie. +1 :) –

Powiązane problemy