regex表示带双精度的行

ubof19bj  于 2021-07-08  发布在  Java
关注(0)|答案(2)|浏览(287)

我对编程相当陌生,regex非常混乱。我试图识别一个数据行,它由3个双精度数组成,中间有空格,例如:500.00 56.48 500.00
我试过这个:

data.matches("^[0-9]+\\.[0-9]+\\s[0-9]+\\.[0-9]+\\s[0-9]+\\.[0-9]+$")

但这条线不认识。我做错什么了?

kzipqqlq

kzipqqlq1#

别用你试过的方法做。

尽管您所使用的regex模式适用于您所使用的数字,但它在很大范围内都会失败。 .5 或者 5.6E2 它们也是 double 数字。
下面是您的数据和模式演示:

public class Main {
    public static void main(String[] args) {
        String data = "500.00 56.48 500.00";
        System.out.println(data.matches("^[0-9]+\\.[0-9]+\\s[0-9]+\\.[0-9]+\\s[0-9]+\\.[0-9]+$"));
    }
}

输出:

true

但是,在以下情况下,它将无法提供预期的结果:

public class Main {
    public static void main(String[] args) {
        String data = ".5 5.6E2 500.00";
        System.out.println(data.matches("^[0-9]+\\.[0-9]+\\s[0-9]+\\.[0-9]+\\s[0-9]+\\.[0-9]+$"));
    }
}

输出:

false

尽管 .5 以及 5.6E2 是有效的 double 数字,你的模式无法识别它们。

推荐方法:

您应该在空白处分割数据行,并尝试使用 Double#parseDouble 例如

public class Main {
    public static void main(String[] args) {
        String data = "500.00 56.48 500.00";
        System.out.println(matches(data));

        data = ".5 5.6E2 500.00";
        System.out.println(matches(data));

        data = ".5 500.00";
        System.out.println(matches(data));

        data = ".5 abc 500.00";
        System.out.println(matches(data));
    }

    static boolean matches(String data) {
        String[] nums = data.split("\\s+");
        boolean match = true;

        if (nums.length == 3) {
            for (String num : nums) {
                try {
                    Double.parseDouble(num);
                } catch (NumberFormatException e) {
                    match = false;
                    break;
                }
            }
        } else {
            match = false;
        }
        return match;
    }
}

输出:

true
true
false
false
rekjcdws

rekjcdws2#

通过观察以下几点来改进正则表达式: [0-9] 与相同 \d 你在寻找同样的模式,三次
所以,让我们这样做:
三次:
一个或多个数字,可选后跟
一个句点,然后是一个或多个数字,可以选择后跟
空白
也就是说: (...){3} 哪里 ... 是: \d+ ,可选后跟 (\.\d+)? (即零或一次),可选择后跟 \s* (零或更多)
把这些放在一起,记住使用正确的字符串转义:

data.matches("^(\\d+(\\.\\d+)?\\s*){3}$")

你可以看到它正在工作https://regex101.com/r/pgxam9/1,强烈建议保留regex101书签以备将来调试。

相关问题