Проблема токенизации в Java с разделителем "." - PullRequest
4 голосов
/ 04 июня 2010

Мне нужно разделить текст с помощью разделителя ". ". Например, я хочу эту строку:

Washington is the U.S Capital. Barack is living there.

Разрезать на две части:

Washington is the U.S Capital. 
Barack is living there.

Вот мой код:

// Initialize the tokenizer
StringTokenizer tokenizer = new StringTokenizer("Washington is the U.S Capital. Barack is living there.", ". ");
 while (tokenizer.hasMoreTokens()) {
      System.out.println(tokenizer.nextToken());

}

И вывод, к сожалению:

Washington
is
the
U
S
Capital
Barack
is
living
there

Может кто-нибудь объяснить, что происходит?

Ответы [ 4 ]

29 голосов
/ 04 июня 2010

Не использовать StringTokenizer; это унаследованный класс Вместо этого используйте java.util.Scanner или просто String.split.

    String text = "Washington is the U.S Capital. Barack is living there.";
    String[] tokens = text.split("\\. ");
    for (String token : tokens) {
        System.out.println("[" + token + "]");
    }

Это печатает:

[Washington is the U.S Capital]
[Barack is living there.]

Обратите внимание, что split и Scanner основаны на регулярном выражении (регулярные выражения), а поскольку . является специальным метасимволом регулярного выражения, его необходимо экранировать с помощью \. В свою очередь, поскольку \ сам по себе является escape-символом для строковых литералов Java, вам необходимо написать "\\. " в качестве разделителя.

Это может показаться сложным, но на самом деле это не так. split и Scanner намного превосходят StringTokenizer, и регулярное выражение не так сложно подобрать.

Учебные пособия по регулярным выражениям

Смежные вопросы

Ссылки API


Но что пошло не так?

Проблема в том, что StringTokenizer принимает каждый символ в строке разделителя в качестве отдельных разделителей, т.е. NOT всего String самого себя.

Из API:

StringTokenizer(String str, String delim): Создает токенайзер строки для указанной строки. Символы в аргументе delim являются разделителями для разделения токенов. Символы-разделители сами по себе не будут рассматриваться как токены.

1 голос
/ 04 июня 2010

Ваш конструктор StringTokenizer принимает разделитель ".", Который соответствует точке или пробелу в качестве разделителей.

0 голосов
/ 29 января 2017
  • StringTokenizer (String str): создает StringTokenizer с указанной строкой.
  • StringTokenizer (String str, String delim): создает StringTokenizer с указанной строкой и разделителем.
  • StringTokenizer (String str, String delim, логическое returnValue): создает StringTokenizer с указанной строкой, разделителем и returnValue.

    Если возвращаемое значение равно true, символы-разделители считаются токенами. Если значение равно false, символы-разделители служат для разделения токенов.

0 голосов
/ 04 июня 2010

Попробуйте удалить пробел после точки в разделителе. Используйте это вместо этого.

StringTokenizer tokenizer = new StringTokenizer("Washington is the U.S Capital. Barack is living there.", ".");
...