Java 带双精度线的正则表达式

Java 带双精度线的正则表达式,java,regex,Java,Regex,我对编程相当陌生,正则表达式非常混乱。我试图确定一条数据线,该数据线由3个双精度线组成,中间有空格,例如: 500.00 56.48 500.00 我试过这个: data.matches("^[0-9]+\\.[0-9]+\\s[0-9]+\\.[0-9]+\\s[0-9]+\\.[0-9]+$") 但这不认识这条线。我做错了什么?不要用你已经尝试过的方式去做。 虽然您使用的正则表达式模式适用于您所使用的数字,但它将无法适用于大范围的数字,例如.5或5.6E2,它们也是双精

我对编程相当陌生,正则表达式非常混乱。我试图确定一条数据线,该数据线由3个双精度线组成,中间有空格,例如: 500.00 56.48 500.00

我试过这个:

data.matches("^[0-9]+\\.[0-9]+\\s[0-9]+\\.[0-9]+\\s[0-9]+\\.[0-9]+$")
但这不认识这条线。我做错了什么?

不要用你已经尝试过的方式去做。 虽然您使用的正则表达式模式适用于您所使用的数字,但它将无法适用于大范围的数字,例如.5或5.6E2,它们也是双精度数字

以下是您的数据和模式演示:

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]+$"));
    }
}
输出:

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

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]+$"));
    }
}
输出:

即使.5和5.6E2是有效的双精度数字,您的模式也无法识别它们

建议的方法是: 您应该在空白处拆分数据行,并尝试使用DoubleparseDouble解析每个数字

输出:


通过观察以下几点来改进正则表达式:

[0-9]与\d相同 你在寻找同样的模式,三次 那么,让我们这样做:

三次: 一个或多个数字,可选后跟 一个句点,然后是一个或多个数字,可以选择后跟 空白 这意味着:

…{3}其中。。。是: \d+,可选后跟 \.\d+?i、 e.零或一次,可选后跟 \s*零或更多 把这些放在一起,记住使用正确的字符串转义:

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

您可以看到这一点,强烈建议将regex101保留为书签以备将来调试。

第1步:实际测试您的模式,看看它达到了什么程度,并再次检查您认为您编写的内容是否是regex101告诉您您的模式实际试图匹配的内容。话虽如此:当\d存在时,无需使用[0-9],请注意,这些数字是相同的,是regex允许您指定为…{3}的三倍,因此无需在您的模式中重复您自己。您的regexp@AlexRudenko演示不会测试任何内容。“真的应该是调试任何与正则表达式相关的东西所需的唯一一站。@Mike'Pomax'Kamermans,它已经在Java上进行了测试,需要按下一个绿色按钮来显示方法匹配、查找、组0的结果。”。regex101显示超时错误。Matcher m=Pattern.compile?m^[0-9]+\.[0-9]+\\s[0-9]+\.[0-9]+\\s[0-9]+\.[0-9]+$.matcherdata;如果m.find{System.out.printlnm.group0;}?感觉有点像是在开玩笑?如果他们的数据文件实际上只是一行已知格式的三元组,为什么要使正则表达式比它需要的更通用?@Mike'Pomax'Kamermans-OP提到过,我试图确定一个数据行,它由3个双元组组成,中间有空格。虽然他给出了一个500.00 56.48 500.00的示例行,但根据该声明,数据行可以是偶数。5 5.6E2 500.00。这太离谱了:询问他们的数据是什么。这是做同样事情的另一种方法,没有任何改进。此外,对于双倍数字,.5.6E2 500.00,它将失败。问题陈述是:我试图确定一条数据线,它由3个双精度数字组成,中间有空格。如果他们说使用了科学记数法,帖子只给出了一个简单小数的例子,一行三个,中间有空格。他们的例子很清楚,所以如果你想根据问题中没有的细节来回答问题,请验证你假设的细节是否正确。
false
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
data.matches("^(\\d+(\\.\\d+)?\\s*){3}$")