Проблемы с Java StringTokenizer - Новичок - PullRequest
0 голосов
/ 17 февраля 2010

Я знаю, что, возможно, я невероятно глуп, но кто-нибудь может пролить свет на мою проблему? Я пытаюсь извлечь заголовок из строки, содержащей html ...

 public static void main(String args[]) {
  System.out.println(getTitle("<title>this is it</title>"));
 }

 public static String getTitle(String a) {
  StringTokenizer token = new StringTokenizer(a, "<title>", false);
  return token.nextToken("</title>");
 }

Продолжает возвращать "ч", и я не могу понять, почему! Я наивный?

Приветствия

Ответы [ 5 ]

2 голосов
/ 17 февраля 2010

Я не уверен, является ли StringTokenizer лучшим классом для использования в вашем сценарии. Может быть, вы можете решить свою задачу с помощью String.subString (int, int). Как указал BearsWillEatYou, если вы хотите сделать более сложный HTML-анализ, используйте стороннюю библиотеку.

public static void main(String args[]) {
    System.out.println(getTitle("<title>this is it</title>"));
}

public static String getTitle(String a) {
    return a.substring(a.indexOf("<title>") + "<title>".length(), a.indexOf("</title>"))
}
2 голосов
/ 17 февраля 2010

Я думаю, что ваша проблема заключается здесь (цитата из API документ , текст, выделенный мной):

"Набор разделителей (символы, разделяющие токены) может быть указан либо во время создания, либо для каждого токена."

То есть разделитель - это не строка, а набор символов. Когда вы передаете "<title>" в качестве второго параметра, вы сообщаете своему токенизатору, что разделителями являются любой символов <, t, i, t, l, e или >. Таким образом, токенизатор покорно пропускает все символы в первом теге, а затем t и возвращает h, потому что его нет в наборе токенов, который вы ему дали, а следующий символ (e) -.

Так что StringTokenizer не совсем то, что вам нужно здесь. Обратите внимание также на это замечание из документации API:

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

Или используйте стороннюю библиотеку, как было отмечено другими.

0 голосов
/ 17 февраля 2010

Если вы анализируете HTML, лучшим способом может быть HTML Cleaner, согласно этому сообщению SO .

Я бы порекомендовал использовать эту специфичную для домена библиотеку, так как она также даст вам простой способ расширить функциональность вашего приложения при необходимости. Или помочь вам с другим приложением, если оно также анализирует HTML.

0 голосов
/ 17 февраля 2010

Вы не можете использовать StringTokenizer таким образом. См. Javadoc http://java.sun.com/j2se/1.4.2/docs/api/java/util/StringTokenizer.html

Аргумент delims содержит набор символов, которые рассматриваются в качестве разделителей в строке. Таким образом, здесь у вас есть «<», «t», «i», ... в качестве разделителей. </p>

для такой работы вам действительно следует рассмотреть возможность использования выделенной библиотеки html или xml. Вы также можете использовать «<>» в качестве разделителей и реализовать минималистский html-парсер, соответствующий вашим потребностям, но это, вероятно, приведет к ошибкам, головным болям и большему количеству ошибок, когда ваши минимальные потребности расширятся.

0 голосов
/ 17 февраля 2010

Указанный вами разделитель - "", что является пустой строкой. Существует пустая строка между «t» и «h» в начале вашей строки, поэтому nextToken возвращает «t». Это нормально и работает как указано. Смотри http://java.sun.com/j2se/1.4.2/docs/api/java/util/StringTokenizer.html

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