Ява добавить символ в строку - PullRequest
1 голос
/ 02 декабря 2011

я получаю большую строку с веб-страницы, и вот так

"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");
     }
}

но внутри моего текста у меня греческие буквы, поэтому isDigit возвращает 1, когда получает несколько греческих букв. У кого-нибудь есть идеи, как решить эту проблему?

Ответы [ 4 ]

2 голосов
/ 02 декабря 2011

Чтобы обеспечить некоторую начальную помощь, строка 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 ");

Это работает так, как вы хотите? Мой терминал не очень хорошо поддерживает эти символы, поэтому у меня может быть проблема с кодировкой локали.

1 голос
/ 02 декабря 2011

Проблема не в обнаружении 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));
}
0 голосов
/ 02 декабря 2011

Попробуйте Шаблон :

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 "
0 голосов
/ 02 декабря 2011

Во-первых, я боюсь, что вы не правы.Я взял греческую азбуку из Википедии и запустил следующий цикл:

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
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...