java - 正则表达式: Finding String and digits

标签 java

我有一个文件,其中包含我的 toString 的字符串 printet 行,如下所示:

[Name: value][age: value][cprNumber: value][group: value][Active: value][Average Grade: float value]

我有一个带有 read 方法的类,该方法读取文件并将每一行作为 ArrayList 中的对象返回。

现在回到我的主类,我试图查看列表中的每个对象,这就是我陷入困境的地方。我正在尝试查找平均等级高于 4 的对象。 有人可以帮我使用正确的正则表达式吗?

最佳答案

您可以使用正则表达式来解析每个String并将键->值对放入Map中。如果需要,这将允许您访问其他值。

您需要做的就是在循环中从Map获取 key 并将其解析为float并检查它的值

public static void main(String[] args) throws ParseException {
    final String[] strings = new String[]{
        "[Name: Bob][age: 27][cprNumber: 1234][group: A][Active: true][Average Grade: 4.1]",
        "[Name: Alice][age: 17][cprNumber: 4321][group: A][Active: true][Average Grade: 4.5]",
        "[Name: James][age: 33][cprNumber: 2134][group: B][Active: true][Average Grade: 2.2]",
        "[Name: Frank][age: 23][cprNumber: 3124][group: B][Active: false][Average Grade: 3.1]"
    };
    final Pattern pattern = Pattern.compile("\\[([^:]++):\\s([^]]++)]");
    final Collection<Float> grades = new LinkedList<Float>();
    for (final String string : strings) {
        final Map<String, String> map = new HashMap<>();
        final Matcher matcher = pattern.matcher(string);
        while (matcher.find()) {
            final String key = matcher.group(1).trim();
            final String value = matcher.group(2).trim();
            map.put(key, value);
        }
        System.out.println(map);
        final float grade = Float.parseFloat(map.get("Average Grade"));
        if (grade > 4) {
            grades.add(grade);
        }
    }
}

输出:

{Name=Bob, Active=true, cprNumber=1234, age=27, Average Grade=4.1, group=A}
{Name=Alice, Active=true, cprNumber=4321, age=17, Average Grade=4.5, group=A}
{Name=James, Active=true, cprNumber=2134, age=33, Average Grade=2.2, group=B}
{Name=Frank, Active=false, cprNumber=3124, age=23, Average Grade=3.1, group=B}
[4.1, 4.5]

此示例有一个 String[],但使用 List 没有什么区别。

您可以创建一个对象来保存该值 - 这将是一种更加面向对象的方法。

编辑

这是一个使用spilt的示例。它的硬编码要多得多 -

public static void main(String[] args) throws ParseException {
    final String[] strings = new String[]{
        "[Name: Bob][age: 27][cprNumber: 1234][group: A][Active: true][Average Grade: 4.1]",
        "[Name: Alice][age: 17][cprNumber: 4321][group: A][Active: true][Average Grade: 4.5]",
        "[Name: James][age: 33][cprNumber: 2134][group: B][Active: true][Average Grade: 2.2]",
        "[Name: Frank][age: 23][cprNumber: 3124][group: B][Active: false][Average Grade: 3.1]"
    };
    final Collection<Float> grades = new LinkedList<Float>();
    for (final String string : strings) {
        final String[] values = string.split("[\\[\\]]+|:");
        final float gpa = Float.parseFloat(values[12].trim());
        if (gpa > 4) {
            grades.add(gpa);
        }
    }
    System.out.println(grades);
}

输出是相同的:

[4.1, 4.5]

关于java - 正则表达式: Finding String and digits,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16155873/

相关文章:

java - Proguard 在尝试使用相机发送图片时导致应用程序崩溃

JavaFX 延迟绘制形状

java - Google App Engine DataNucleus 3.1.1 意外异常错误

java - 如何在jsp中发送邮件进行邮件验证

java - 自定义ConfigurationFactory结合log4j2中的配置文件

java - 通过 jni 将枚举 native 类型公开给 java?

java - 如何通过java j2ee中的 Controller 设置外键?

java - 使用 gson 反序列化接口(interface)数据无法取回值?

java - 是否可以将不可变列表作为 Java 中不可变映射内的值字段?

java - JPA 2.0 : Embedded object exclusive to one entity