токенайзер строк в Java - PullRequest
       43

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

21 голосов
/ 01 марта 2010

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

ABC | DEF || FGHT

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

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

Ответы [ 7 ]

60 голосов
/ 01 марта 2010

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

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

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

String s = "ABC|DEF||FGHT";
String[] r = s.split("\\|");
15 голосов
/ 01 марта 2010

Используйте флаг 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));

9 голосов
/ 01 марта 2010

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

Из Javadocs:

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

2 голосов
/ 29 марта 2015

Вот еще один способ решить эту проблему

   String str =  "ABC|DEF||FGHT";
   StringTokenizer s = new StringTokenizer(str,"|",true);
   String currentToken="",previousToken="";


   while(s.hasMoreTokens())
   {
    //Get the current token from the tokenize strings
     currentToken = s.nextToken();

    //Check for the empty token in between ||
     if(currentToken.equals("|") && previousToken.equals("|"))
     {
        //We denote the empty token so we print null on the screen
        System.out.println("null");
     }

     else
     {
        //We only print the tokens except delimiters
        if(!currentToken.equals("|"))
        System.out.println(currentToken);
     }

     previousToken = currentToken;
   }
2 голосов
/ 01 марта 2010

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

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

0 голосов
/ 20 июня 2018

Вот способ разбить строку на токены (токен состоит из одной или нескольких букв)

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    String s = scan.nextLine();
    s = s.replaceAll("[^A-Za-z]", " ");
    StringTokenizer arr = new StringTokenizer(s, " ");
    int n = arr.countTokens();
    System.out.println(n);
    while(arr.hasMoreTokens()){
        System.out.println(arr.nextToken());
    }
    scan.close();
}
0 голосов
/ 21 ноября 2013
package com.java.String;

import java.util.StringTokenizer;

public class StringWordReverse {

    public static void main(String[] kam) {
        String s;
        String sReversed = "";
        System.out.println("Enter a string to reverse");
        s = "THIS IS ASHIK SKLAB";
        StringTokenizer st = new StringTokenizer(s);


        while (st.hasMoreTokens()) {
            sReversed = st.nextToken() + " " + sReversed;
        }

        System.out.println("Original string is : " + s);
        System.out.println("Reversed string is : " + sReversed);

    }
}

Выход:

Введите строку для обратного

Оригинальная строка: ЭТО АШИК СКЛАБ

Обратная строка: СКЛАБ АШИК ЭТО

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...