从" messy"中提取多种数据类型Java字符串

时间:2015-11-10 01:24:35

标签: java string list text extract

我需要分别从文本文件中提取名称,年份和评级,分别为String,Int和float。然后我用我提取的数据实例化一个对象列表。我已经缓存了一串看起来像这样的文本。

!Women Art Revolution (2010) |   3 stars, 1hr 22m

然后我将这个字符串分成两部分在" |"字符。

String[] splitStr  = line.split("|");
                part1 = splitStr[0];
                part2 = splitStr[1];

我计划使用扫描仪并将part1中的所有Int收集到一个字符串中并抓住最后四个用于该年份。我将使用类似的方法进行评级。我的问题是获取名称字符串。 Scanner.next似乎没有从标题名称中获取像!,数字和()这样的符号。全文文件中的标题名称不是任何易于解析的特定格式。如何为我的构造函数中使用的标题创建一个String?

masterList.add(new Movie(name, year, rating));

此外,从一些较大的列表(总共10k左右的项目)中的示例:

3-Day Weekend (2008) |   2.9 stars, 1hr 23m
3:15 (U.S) (1986) |   2.9 stars, 53m
Real (2011) |   3.7 stars, 1hr 34m
Real: The Movie (2005) |   3.3 stars, 1hr 31m

1 个答案:

答案 0 :(得分:3)

为什么不使用正则表达式?

例如,正则表达式^!(.*) \((\d*)\) *\| *([\d.]*) *stars,.*$将分别在捕获组1,2和3时为您提供名称,年份和评级。

更新:额外参考

  1. 有关Java支持的regex(正则表达式)本身的语法,您可以参考enter link description here
  2. 您可以在Java中找到{Regex的tutorial介绍
  3. 以下是正则表达式本身的解释,分解为小部分:

    • ^:从
    • 开始
    • !:感叹号
    • (:开始捕获第1组
    • .*:任意数字的出现次数
    • ):捕获第1组的结束
    • \(:一个左括号
    • (:开始捕获第2组
    • \d*:任意数量的数字
    • ):捕获第2组的结束
    • \):一个近似括号
    • *:任意数量的空格
    • \|:竖线字符
    • *:任意数量的空格
    • (:开始捕获第3组
    • [\d.]*:任何不存在数字或点
    • ):捕获第3组的结束
    • *:任意数量的空格
    • stars,:跟随字符串stars,
    • .*:跟随任意数量的任何字符
    • $:直到字符串结尾

    示例代码:

    String input = "!Women Art Revolution (2010) |   3 stars, 1hr 22m";
    
    // mind the extra escaping of \ char because of Java string literal escaping
    Pattern p = Pattern.compile("^!(.*) \\((\\d*)\\) *\\| *([\\d.]*) *stars,.*$");  
    Matcher m = p.matcher(input);
    System.out.println("matches? " + m.matches());
    System.out.println("name: " + m.group(1));
    System.out.println("name: " + m.group(2));
    System.out.println("name: " + m.group(3));
    

    应该给你

    matches? true
    name: Women Art Revolution
    name: 2010
    name: 3