这部分我可能弄错了,但将两者分开的原因是因为group() http://download.oracle.com/javase/6/docs/api/java/util/regex/Matcher.html#group()只会匹配最后一个匹配的子序列,这是每次调用所匹配的内容find() http://download.oracle.com/javase/6/docs/api/java/util/regex/Matcher.html#find().罢工>谢谢,马克·拜尔斯。
不过,当然,您可以通过将所需的整个部分放入“捕获组”中来解决此问题,这是通过将其放在括号中来完成的。这样您就可以将正则表达式的匹配部分组合成一个子字符串。您的模式将如下所示:
Pattern.compile("C=(\\d+\\.\\d+)")
对于解析 3567 或 3.567,您的模式将是 C=(\\d+(\\.\\d+)?)
其中第 1 组代表整数。另外,请注意,由于您特别想匹配句点,因此您想逃避您的.
(句点)字符,这样它就不会被解释为“任意字符”标记。不过,对于这个输入来说,这并不重要
然后,要获得 3.567,您需要致电 m。group(1) http://download.oracle.com/javase/6/docs/api/java/util/regex/Matcher.html#group(int)获取第一个(从 1 开始计数)指定的组。这意味着您的 Double.parseDouble 调用本质上会变成Double.parseDouble("3.567")
至于将 C= 从您的模式中剔除,因为我不太熟悉 RegExp,所以我可能会建议您split http://download-llnw.oracle.com/javase/6/docs/api/java/lang/String.html#split(java.lang.String)将输入字符串放在分号上,然后检查每个分割是否包含 C;然后您可以应用该模式(使用捕获组)从匹配器中获取 3.567。
Edit对于 gawi 评论中更一般(并且可能更有用!)的情况,请使用以下内容(来自http://www.regular-expressions.info/floatingpoint.html http://www.regular-expressions.info/floatingpoint.html)
Pattern.compile("[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?")
这支持可选符号、可选整数或可选小数部分以及可选正/负指数。在需要的地方插入捕获组以单独挑选零件。指数作为一个整体在它自己的组中,使其作为一个整体是可选的。