我需要分别从文本文件中提取名称,年份和评级,分别为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
等
答案 0 :(得分:3)
为什么不使用正则表达式?
例如,正则表达式^!(.*) \((\d*)\) *\| *([\d.]*) *stars,.*$
将分别在捕获组1,2和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