Проблема не в обнаружении 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
в построитель строк, каждый символ после этого разрыва строки перемещается на один символ назад.Чтобы исправить это, вам нужно сосчитать все разрывы строк, которые вы уже вставили, и если вы вставите новый, вы должны вставить его в позицию 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));
}