我有一个看起来像“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之前如何去除它?

最佳答案

我可能会在这部分上弄错了,但之所以将两者分开是因为group()只匹配最后匹配的子序列,这是每次find()调用都会匹配的东西。谢谢马克·拜尔斯。

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

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

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

然后,要得到3.567,您将 call m。 group(1)获取第一个(从1开始计数)指定的组。这意味着您的Double.parseDouble调用实际上将变成Double.parseDouble("3.567")
至于从您的模式中删除C =,因为我不太熟悉RegExp,所以我建议您在分号上用split输入字符串,然后检查每个拆分是否包含C;那么您可以应用模式(与捕获组一起使用)从Matcher中获取3.567。

编辑对于gawi评论中更一般(可能更有用!)的案例,请使用以下内容(来自http://www.regular-expressions.info/floatingpoint.html)
Pattern.compile("[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?")

它支持可选符号,可选整数或可选小数部分以及可选正/负指数。在需要的地方插入捕获组,以分别挑选零件。整个指数都在自己的组中,以使其整体上是可选的。

10-08 16:23