Java:如何从正则表达式中解析double

时间:2010-09-09 23:14:12

标签: java regex

我的字符串看起来像“A = 1.23; B = 2.345; C = 3.567”

我只对“C = 3.567”感兴趣

到目前为止我所拥有的是:

     Matcher m = Pattern.compile("C=\\d+.\\d+").matcher("A=1.23;B=2.345;C=3.567");

    while(m.find()){ 
        double d = Double.parseDouble(m.group());
        System.out.println(d);
    }

问题是它显示3与567分开

输出:

3.0

567.0

我想知道如何包含小数,以便输出“3.567”

编辑:我还想匹配C,如果它没有小数点: 所以我想捕获3567以及3.567

因为C =也被内置到模式中,如何在解析double之前将其删除?

5 个答案:

答案 0 :(得分:33)

我可能在这方面有误,但是它将两者分开的原因是因为group()只匹配最后匹配的子序列,这是每次调用{{3}时匹配的任何子序列}。 谢谢,Mark Byers。

当然,您可以通过将所需的整个部分放在“捕获组”中来解决此问题,这可以通过将其放在括号中来完成。这使得您可以将正则表达式的匹配部分组合到一个子字符串中。您的模式将如下所示:

Pattern.compile("C=(\\d+\\.\\d+)")

对于解析3567或3.567,您的模式将是 C=(\\d+(\\.\\d+)?) ,其中组1代表整数。另外,请注意,由于您特别想要匹配句点,因此您希望转义.(句点)字符,以使其不被解释为“任意字符”标记。但是,对于此输入,无关紧要

然后,为了得到你的3.567,你会打电话给m。find()来抓住第一个(从1开始)指定的组。这意味着您的Double.parseDouble调用基本上会变为Double.parseDouble("3.567")

至于从你的模式中取出C =,因为我不熟悉RegExp,我可能会建议你在分号上group(1)输入字符串,然后查看是否每个分裂包含C;然后你可以应用模式(带有捕获组)从你的匹配器中获取3.567。

编辑有关gawi评论中更一般(也可能更有用!)的案例,请使用以下内容(来自split

Pattern.compile("[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?")

这支持可选符号,可选整数或可选小数部分,以及可选的正/负指数。在需要的位置插入捕获组以单独挑选部件。作为一个整体的指数在它自己的组中,使它作为一个整体是可选的。

答案 1 :(得分:6)

您的正则表达式仅匹配数字字符。为了也匹配小数点,你需要:

Pattern.compile("\\d+\\.\\d+")

.被转义,因为这会在未转义时匹配任何字符。

注意:这将只匹配带小数点的数字,这就是你的例子中的数字。

答案 2 :(得分:2)

要匹配任何数字和点的序列,您可以将正则表达式更改为:

"(?<=C=)[.\\d]+"

如果你想确定只有一个点,你可能想尝试这样的事情:

"(?<=C=)\\d+(?:\\.\\d+)?"

您还应该知道此模式可以与1.2中的ABC=1.2.3;匹配。您应该考虑是否需要改进正则表达式以正确处理这种情况。

答案 3 :(得分:2)

如果你需要用点,逗号,正数和负数来验证小数:

Object testObject = "-1.5";
boolean isDecimal = Pattern.matches("^[\\+\\-]{0,1}[0-9]+[\\.\\,][0-9]+$", (CharSequence) testObject);
祝你好运。

答案 4 :(得分:0)

如果您希望输入的正则表达式可能是双精度或只是整数而没有任何* .0内容,则可以使用以下命令: