gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:00:21 25 4
gpt4 key购买 nike

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

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

然后我在“|”处将该字符串分成两部分性格。

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

我计划使用扫描仪将第 1 部分中的所有 Int 收集到一个字符串中,并获取最后四个以供今年使用。我将使用类似的方法进行评级。我的问题是获取名称字符串。 Scanner.next 似乎没有从标题名称中获取 !、数字和 () 等符号。全文文件中的标题名称没有采用任何似乎易于解析的特定格式。如何为标题创建一个字符串以在构造函数中使用?

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

等等

最佳答案

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

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

<小时/>

更新:额外引用

  1. Java本身支持的regex(正则表达式)语法可以引用enter link description here
  2. 您可能会找到介绍性的tutorial Java 中的正则表达式

以下是对正则表达式本身的解释,将其分解为小块:

  • ^:以
  • 开头
  • !:感叹号
  • (:捕获组 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

关于java - 从 "messy"Java 字符串中提取多种数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33621323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com