使用StringTokenizer解析字符串提取信息时出现异常行为该如何修正
问题根因
StringTokenizer的nextToken(String delim)的入参是单字符分隔符集合,不是完整匹配的字符串。你传入"by"时,b和y两个字符都会被识别为分隔符,所以Charlie Montoya末尾的y被切分,导致作者名被截断、date字段错位。- 读取id时调用
nextToken(".")后,解析位置停在.之前,未消费的.会被带入下一次读取的内容开头,导致title前缀多出冗余点号。
修正方案
方案1:调整StringTokenizer逻辑(兼容原有写法)
String line = "21. Sponge Cake by Charlie Montoya [2014-10-13]"; StringTokenizer tokenizer = new StringTokenizer(line, " "); // 提取id String id = tokenizer.nextToken(".").trim(); // 跳过id后的.和前置空格 tokenizer.nextToken(" "); // 提取title:读到by标识为止 String title = tokenizer.nextToken("by").trim(); // 跳过by和前置空格 tokenizer.nextToken(" "); // 提取author:读到日期左括号为止 String author = tokenizer.nextToken("[").trim(); // 提取日期:读到右括号为止 String date = tokenizer.nextToken("]").trim(); // 输出验证 System.out.println("id = \"" + id + "\";"); System.out.println("title = \"" + title + "\";"); System.out.println("author = \"" + author + "\";"); System.out.println("date = \"" + date + "\";");
方案2:正则表达式解析(更稳定,推荐)
使用正则匹配直接分组提取所有字段,适配性更强,不会出现分隔符误判问题:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class Parser { public static void main(String[] args) { String line = "21. Sponge Cake by Charlie Montoya [2014-10-13]"; // 正则分组:1=id 2=title 3=author 4=date Pattern pattern = Pattern.compile("(\\d+)\\. (.*?) by (.*?) \\[(.*?)\\]"); Matcher matcher = pattern.matcher(line); if (matcher.find()) { String id = matcher.group(1); String title = matcher.group(2); String author = matcher.group(3); String date = matcher.group(4); System.out.println("id = \"" + id + "\";"); System.out.println("title = \"" + title + "\";"); System.out.println("author = \"" + author + "\";"); System.out.println("date = \"" + date + "\";"); } } }
以上两种方案输出均符合要求:
id = "21"; title = "Sponge Cake"; author = "Charlie Montoya"; date = "2014-10-13";
内容的提问来源于stack exchange,提问作者NickJ
相关产品推荐
相关产品推荐

