2012-03-12 50 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 2012-03-12 06:06:09

+0

public list splitInfoText(String msg){ \t \t int MAX_WIDTH = 50; \t \t \t DEF \t線= [] \t \t \t 字符串\t []字; \t \t \t msg = msg.trim(); \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如果(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(s.length()> 0) \t \t \t \t \t線<< s.toString()。修剪() \t \t \t \t \t return line; \t \t \t} – Nimmy 2012-03-12 06:55:41

+0

@Nimmy:我試圖把你的代碼放到問題的主體中,但是如果你自己編輯你的問題並放入你的代碼中,它會更好。 – PearsonArtPhoto 2012-03-12 07:02:23

回答

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 2012-03-12 07:52:59

+0

@JRSofty:我忘了初始化'matchList'參數 - 它現在能工作嗎?如果沒有,那究竟是什麼問題? – 2012-03-12 08:01:43

+0

現在,它的工作。原文捕獲的空白,但除了一個單詞的文字。這符合我的預期。 – JRSofty 2012-03-12 08:07:18

4

我相信,蒂姆的回答的更巧妙的版本是:

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

我根本不瞭解Groovy,但這對我來說看起來很時髦。 +1 :) – 2012-03-12 10:32:48

相關問題