Java:如何从正则表达式解析双精度

2022-09-01 22:01:43

我有一个字符串,看起来像“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=也内置于模式中,因此在解析双精度之前如何将其剥离?


答案 1

我可能在这一部分弄错了,但它将两者分开的原因是因为group()只会匹配最后匹配的子序列,这是每次调用find()匹配的任何内容。谢谢,马克·拜尔斯。

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

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

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

然后,要获得 3.567,您可以调用 m.group(1) 来获取第一个(从 1 开始计数)指定的组。这意味着您的Double.parseDouble调用基本上会变成Double.parseDouble("3.567")

至于将C=从您的模式中删除,由于我对RegExp不是很精通,我可能会建议您在分号上拆分输入字符串,然后检查每个拆分是否包含C;然后,您可以应用该模式(使用捕获组)从您的匹配器中获取3.567。

编辑对于gawi评论中更一般(可能更有用!)的情况,请使用以下内容(来自 http://www.regular-expressions.info/floatingpoint.html)

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

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


答案 2

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

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

之所以转义,是因为在未转义时,这将匹配任何字符。.

注意:这将仅将数字与小数点匹配,这是您在示例中所拥有的。