正则表达式:查找字符串和数字

时间:2013-04-22 20:12:37

标签: java

我的toString包含一个字符串为printet的文件,如下所示:

  

[姓名:] [年龄:] [cprNumber: value ] [group:   ] [有效:] [平均成绩:浮动值]

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

现在回到我的主类,我正在尝试查看List中的每个对象,这就是我被困住的地方。我正在尝试找到平均成绩高于4的对象。 有人可以帮我正确的正则表达式吗?

2 个答案:

答案 0 :(得分:1)

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

您需要做的就是,在循环中,从Map获取密钥并将其解析为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将没有任何区别。

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

修改

以下是使用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]

答案 1 :(得分:0)

正则表达式不适合数字计算/比较。

如果您的问题中的双引号确实存在于您的文件中。对于您的示例,您可以获得一行,这将给出您的浮点数(在String中)。

row.split("\\"")[1];

然后您可以检查上面>4的值是否正确,您可能需要先将其转换为数字。

如果你可以使用第三部分lib,guava有一个很好的filter()函数,你可以看看。

修改

如果双引号不在您的文件中,您仍然可以使用split()

String[] arr=row.split("(: |])");
arr[arr.length-1] //this is the float

例如:

final String[] arr = "[Name: value][age: value][cprNumber: value][group: value][Active: value][Average Grade: 4343.0]".split("(: |])");
    System.out.println(arr[arr.length - 1]);

输出:

4343.0