2011-12-02 103 views
1

我從網頁上得到一個大的字符串,其像這樣Java對象增加字符轉換成字符串

"07:10Ο ΑΣΔΦΑΣΔΦ07:30ΑΣΔΦΑΣΔΦ10:15ΝΑΣΔΦΑΣΔΦ" 

,我想每一次我覺得時間像這樣的「17:50」或「07:30」在時間之前獲得新的線路!所以我將有

07:10 ΑΣΔΦΑΣΔΦ 
07:30 ΑΣΔΦΑΣΔΦ 
10:15 ΝΑΣΔΦΑΣΔΦ 

等等

但這裏是我的問題,我想這個

StringBuilder builder = new StringBuilder(text); 
for (int i = 0; i < text.length(); i++) { 
    if(Character.isDigit(text.charAt(i))){ 
      builder.insert(i, "\n"); 
    } 
} 

到copmare字母,但我的文字裏,我有希臘字母,因此ISDIGIT返回1時,它會得到一些希臘字母。任何人有任何想法如何解決這個問題?

+0

你不能使用正則表達式? – 2011-12-02 17:17:03

+2

請清理你的問題。你的例子沒有希臘字母,你聲稱是你的問題的來源。字符串「00:23」「12:45」在您的示例字符串中出現0次。您的示例輸出似乎與您的示例輸入無關。 「06:45」和「06.45」之間有意義的區別嗎?我注意到您的示例輸入中有一個「56:65」。 「99:99」是有效的時間嗎?那麼「11111.99」呢?如果你能澄清/清理,我可以幫忙。 – ccoakley

+0

@ccoakley這只是一個例子,好吧,我引用了原文,看看它是怎麼回事。 –

回答

2

提供一些初步幫助,()線是不是做了什麼builder.insert你可能想:

StringBuilder builder = new StringBuilder(text); 
for (int i = 0; i < text.length(); i++) { 
    if(Character.isDigit(text.charAt(i))){ 
      builder.insert(i, "\n"); // questionable 
    } 
} 

你真的想`\ N1 \ N2:\ N4 \ N5" 爲字符串「12:45」?

你可能只是想匹配"\\d\\d[:.]\\d\\d"和前面加上「\ n」 postpend「」在每場比賽,但我不能肯定我理解你的問題。

具體來說,我剛剛嘗試過:

String str = "07:10Ο Σκούμπι Ντου & ο κολλητός του07:30Πρωϊνή μελέτη10:15Νηστικοί πράκτορες11:15Σαρίτα, είσαι η ζωή μου12:50Οι ειδήσεις του Star13:45Made in Star15:45Μίλα17:45Ειδήσεις17:50Φώτης - Μαρία live19:45Οι ειδήσεις του Star21:00Ο Χαρί Πότερ και ο ημίαιμος πρίγκιψ00:15Σχολή για απατεώνες01:15Supernatural02:15Gypsy woman02:30Τα πλοκάμια του τρόμου03:45Ραπ πάρτι04:30The Dead zone"; 
return str.replaceAll("(\\d\\d[:.]\\d\\d)", "\n$1 "); 

這是否按照你想要的方式工作?我的終端似乎不太支持這些字符,所以我可能會遇到語言環境編碼問題。

+0

是的,我知道第一我只嘗試了一個數字,但我得到了這個問題,我沒有恢復。我想要「\ n12:45」 –

+0

你是否願意使用正則表達式? – ccoakley

+0

@AlexanderFragotsis:谷歌爲Java正則表達式教程,並選擇一個你找到最好的。我沒有真正的建議。但是,如果我瞭解您的問題,我可能會有一些東西(請參閱我的編輯)。這在「12:45」和「12.45」兩種格式中都適用。我不確定你的初始文章是否是有意的。 – ccoakley

1

問題不在於isDigit檢測,問題是builder.insert(i, "\n");

試試這個,它的工作原理沒有insert

@org.junit.Test 
public void endodingTest() { 
    String text = "07:10Ο Σκούμπι Ντου & ο κολλητός...."; 
    StringBuilder builder = new StringBuilder(); 
    for (int i = 0; i < text.length(); i++) { 
     char c = text.charAt(i); 
     if(Character.isDigit(c)) { 
      builder.append("\n"); 
     } 
     builder.append(c); 

    } 
    System.out.println(builder.toString()); 
} 

的問題是,你在字符串生成器插入額外\n是每次,該行突破後每字符變爲向後移動一個字符。要糾正這一點,你要算你已經插入linebreakes,如果你插入一個新的,你必須在位置i + numberOfAlreadyInsertedLineBreaks

builder.insert(i + numberOfAlreadyInsertedLineBreaks, "\n");) 完成下面的例子)


的第二件事情,將其插入當然(但你已經知道了)是你必須改善你的模式,所以最後這是精靈

@org.junit.Test 
public void endodingTest() { 
    String text = "07:10Ο Σκούμπι Ντου & ο κολλητός του07:30Πρωϊνή μελέτη10:15Νηστικοί πράκτορες11:15Σαρίτα, είσαι η ζωή μου12:50Οι ειδήσεις του Star13:45Made in Star15:45Μίλα17:45Ειδήσεις17:50Φώτης - Μαρία live19:45Οι ειδήσεις του Star21:00Ο Χαρί Πότερ και ο ημίαιμος πρίγκιψ00:15Σχολή για απατεώνες01:15Supernatural"; 
    StringBuilder builder = new StringBuilder(text); 
    int numberOfAlreadyInsertedLineBreaks = 0; 
    for (int i = 0; i < text.length(); i++) { 

     if (match(text, i)) { 
      builder.insert(i + numberOfAlreadyInsertedLineBreaks, '\n'); 
      numberOfAlreadyInsertedLineBreaks++; 
     } 

    } 
    System.out.println(builder.toString()); 
} 

private boolean match(String text, int i) { 
    return Character.isDigit(text.charAt(i)) 
      && Character.isDigit(text.charAt(i + 1)) 
      && text.charAt(i + 2) == ':' 
      && Character.isDigit(text.charAt(i + 3)) 
      && Character.isDigit(text.charAt(i + 4)); 
} 
+0

是的插入後顯然(我,「\ n」)我的價值不像以前一樣,所以我得到的錯誤。 –

+0

@亞歷山大Fragotsis:請測試它,它的工作原理,真的 – Ralph

0

首先,我恐怕你錯了。我把希臘從ABC維基百科和運行在它下面的循環:

public static void main(String[] args) { 
    System.out.println("before"); 
    String greek = "ΑαΒβΓγΔδΕεΖζΗηΘθΙιΚκΛλΜμΝνΞξΟοΠπΡρΣσςΤτΥυΦφΧχΨψΩω"; 
    for (char c : greek.toCharArray()) { 
     if (Character.isDigit(c)) { 
      System.out.println("digit is found: " + c); 
     } 
    } 
    System.out.println("after"); 
} 

印刷:

before 
after 

這正確意味着isDigit()作品。

關於從字符串中提取時間。我建議你使用以下正則表達式:

Pattern p = Pattern.compile("(\\d{2}:\\d{2})"); 
    Matcher m = p.matcher(str); 
    int start = 0; 
    while(m.find(start)) { 
     String time = m.group(1); 
     start = m.end(); 
       // time variable contain time HH:mm. Just use it as you need 
    } 
0

嘗試Pattern

scala> java.util.regex.Pattern.compile("(\\d\\d.\\d\\d)").matcher("first12.34second56.78third90.12fourth34.56").replaceAll("$1 ") 
res1: java.lang.String = "first12.34 second56.78 third90.12 fourth34.56 " 


scala> java.util.regex.Pattern.compile("(\\d\\d.\\d\\d)").matcher("αβγδεζηθικλ12.34αβγδεζηθικλ56.78αβγδεζηθικλ90.12αβγδεζηθικλ34.56").replaceAll("$1 ") 
res2: java.lang.String = "αβγδεζηθικλ12.34 αβγδεζηθικλ56.78 αβγδεζηθικλ90.12 αβγδεζηθικλ34.56 "