2011-12-02 155 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 "