строковый токенизатор в Java

У меня есть текстовый файл, который содержит данные, разделенные '|'. Я должен получить каждое поле (разделенный '|') и обработать его. Текстовый файл можно показать как указано ниже:

ABC|DEF || FGHT

Я использую строковый токенизатор (JDK 1.4) для получения каждого значения поля. Теперь проблема, я должен получить пустую строку после DEF.However, я не получаю вакуум между DEF & FGHT.

Мой результат должен быть - ABC, DEF"", FGHT, но я получаю ABC, DEF, FGHT

21
задан bmargulies 1 March 2010 в 14:02
поделиться

4 ответа

Из документации StringTokenizer :

StringTokenizer - это унаследованный класс, который сохраняется по причинам совместимости хотя его использование не рекомендуется в новом коде. Рекомендуется, чтобы те, кто кто ищет эту функциональность, использовать метод split в String или java.util.regex.

Следующий код должен работать:

String s = "ABC|DEF||FGHT";
String[] r = s.split("\\|");
60
ответ дан 29 November 2019 в 06:12
поделиться

Используйте флаг returnDelims и проверьте два последующих вхождения разделителя:

String str = "ABC|DEF||FGHT";
String delim = "|";
StringTokenizer tok = new StringTokenizer(str, delim, true);

boolean expectDelim = false;
while (tok.hasMoreTokens()) {
    String token = tok.nextToken();
    if (delim.equals(token)) {
        if (expectDelim) {
            expectDelim = false;
            continue;
        } else {
            // unexpected delim means empty token
            token = null;
        }
    }

    System.out.println(token);
    expectDelim = true;
}

выводит

ABC
DEF
null
FGHT

API некрасивый и поэтому считается устаревшим (т.е. «почти устаревшим»). Используйте его только там, где сопоставление с образцом слишком дорого (что должно быть только в случае очень длинных строк) или где API ожидает перечисление.

Если вы переключитесь на String.split (String) , обязательно укажите разделитель в кавычках. Либо вручную ( «\\ |» ), либо автоматически с помощью string.split (Pattern.quote (delim));

15
ответ дан 29 November 2019 в 06:12
поделиться

вы можете использовать конструктор, который принимает дополнительное логическое значение returnDelims и передает ему значение true. таким образом вы получите разделители, которые позволят вам обнаружить это условие.

в качестве альтернативы вы можете просто реализовать свой собственный токенизатор строк, который сделает то, что вам нужно, это не так сложно.

2
ответ дан 29 November 2019 в 06:12
поделиться

StringTokenizer игнорирует пустые элементы. Рассмотрите возможность использования String.split, который также доступен в версии 1.4.

Из документации javadocs:

StringTokenizer - это устаревший класс, который сохранен по соображениям совместимости , хотя его использование не рекомендуется в новом коде . Рекомендуется, чтобы любой, желающий получить эту функцию, использовал вместо этого метод разделения String или пакет java.util.regex.

9
ответ дан 29 November 2019 в 06:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: