问题不在于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));
}
你不能使用正则表达式? – 2011-12-02 17:17:03
请清理你的问题。你的例子没有希腊字母,你声称是你的问题的来源。字符串“00:23”“12:45”在您的示例字符串中出现0次。您的示例输出似乎与您的示例输入无关。 “06:45”和“06.45”之间有意义的区别吗?我注意到您的示例输入中有一个“56:65”。 “99:99”是有效的时间吗?那么“11111.99”呢?如果你能澄清/清理,我可以帮忙。 – ccoakley
@ccoakley这只是一个例子,好吧,我引用了原文,看看它是怎么回事。 –