【问题标题】:Extracting multiple Data types from "messy" Java String从“混乱”的 Java 字符串中提取多种数据类型
【发布时间】:2015-11-10 01:24:35
【问题描述】:

我需要从文本文件中分别提取名称、年份和评级作为字符串、整数和浮点数。然后我用我提取的数据实例化一个对象列表。我已经缓冲了一个看起来像这样的文本字符串。

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

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

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

我计划使用扫描仪将 part1 中的所有 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

等等

【问题讨论】:

    标签: java string list text extract


    【解决方案1】:

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

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


    更新:额外参考

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

    这里是正则表达式本身的解释,分解成小块:

    • ^:从
    • 开始
    • !:感叹号
    • (: 捕获组 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 新手,还没有听说过正则表达式。你能详细说明一下语法吗?
    • 对正则表达式本身进行了一些调整以应对您更新的模式(由于评级中可能出现点)
    • 好的,非常感谢。很抱歉从一开始就不清楚。正则表达式似乎超级有用,我很尴尬我还没有学会它。另外我假设 group() 返回字符串?
    • @user2430428 继续检查 Matcher 的 API。 (你应该开始学习如何使用 API 文档)
    猜你喜欢
    • 2017-04-20
    • 2014-02-23
    • 1970-01-01
    • 2021-07-02
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    相关资源
    最近更新 更多