Java StringTokenizer麻烦 - 新手

时间:2010-02-17 15:13:06

标签: java

我知道我在这里可能是非常愚蠢的,但任何人都能解释我的问题吗?我正在尝试从包含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>");
 }

继续返回“h”,我无法理解为什么!我天真?

干杯

5 个答案:

答案 0 :(得分:2)

我认为你的问题就在这里(引自the API doc,由我加粗的文字):

分隔符组(分隔标记的字符)可以在创建时或基于每个标记指定。”

也就是说,分隔符不是字符串,而是一组字符。当您将"<title>"作为第二个参数传递时,您告诉您的令牌系统分隔符是任何字符<ti,{ {1}},tle。因此,标记生成器会尽职地跳过第一个标记中的所有字符,然后>,并返回t,因为它不在您提供的标记集中,而是下一个字符(h )是。

所以e不是你需要的。另请注意API文档中的这句话:

StringTokenizer是一个遗留类,出于兼容性原因而保留,但在新代码中不鼓励使用。建议所有寻求此功能的人使用StringTokenizer split方法或改为String包。“

或者使用第三方库,正如其他人所指出的那样。

答案 1 :(得分:2)

我不确定StringTokenizer是否是在您的方案中使用的最佳类。也许你可以使用String.subString(int,int)来解决你的任务。正如BearsWillEat所示,如果您想进行更复杂的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 :(得分:0)

您指定的分隔符是“”,这是空字符串。在你的字符串开头的“t”和“h”之间有一个空字符串,因此nextToken返回“t”。 这是正常的,并按指定的方式工作。见http://java.sun.com/j2se/1.4.2/docs/api/java/util/StringTokenizer.html

答案 3 :(得分:0)

你不能这样使用StringTokenizer。请参阅javadoc http://java.sun.com/j2se/1.4.2/docs/api/java/util/StringTokenizer.html

delims参数包含在字符串中被视为分隔符的字符集。因此,在这里,你有“&lt;”,“t”,“i”,...作为分隔符。

对于那种工作,你真的应该考虑使用html或xml专用库。 你也可以使用“&lt;&gt;”作为分隔符,并根据您的需求实现极简主义的HTML解析器,但是一旦您的最小需求延伸,这可能会导致错误,头痛和更多错误。

答案 4 :(得分:0)

如果要解析HTML,最好的方法可能是HTML Cleaner, according to this SO post

我建议使用此特定于域的库,因为它还可以让您在需要时轻松扩展应用程序的功能。或者如果它还在解析HTML,请帮助您使用另一个应用程序。