为了账号安全,请及时绑定邮箱和手机立即绑定

正则表达式从文件中检索双数字,但忽略具有多个点的数字

正则表达式从文件中检索双数字,但忽略具有多个点的数字

小怪兽爱吃肉 2023-09-13 18:05:58
检索文件中的所有双精度数字并返回总和,但避免使用多个点的值。测试用例 :在文件中12.3,123.45,19,2.16.8.1.1输出预期输出 -> 154.75 我的输出 -> 166.01-?\\d+\\.?\\d* 这将检索所有双数字,但无法忽略带有多个点的数字。FileReader reader = new FileReader(filename);BufferedReader in = new BufferedReader(reader);String line;while ((line = in.readLine()) != null) {    Pattern pattern = Pattern.compile("-?\\d+\\.?\\d*");    Matcher matcher = pattern.matcher(line);    while (matcher.find()) {        String x = matcher.group(0);        y = Double.parseDouble(x);        sum = sum + y;    }}预期输出 -> 154.75 我的输出 -> 166.01
查看完整描述

3 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

您可以使用

-?(?<!\d)(?<!\d\.)\d*\.?\d+(?!\.?\d)

如果不需要匹配-前面的可选项,则将其删除即可。

请参阅正则表达式演示

细节

  • -?- 可选的连字符

  • (?<!\d)(?<!\d\.)- 紧靠左边,不应有数字或数字 +.

  • \d*- 0+ 位数字

  • \.?- 一个可选的点

  • \d+- 1+ 位数字

  • (?!\.?\d)- 紧靠右边,不能有数字或.+数字。

在 Java 中,使用:

Pattern pattern = Pattern.compile("-?(?<!\\d)(?<!\\d\\.)\\d*\\.?\\d+(?!\\.?\\d)");


查看完整回答
反对 回复 2023-09-13
?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

我无法阅读这些正则表达式,它们对于普通人来说太复杂了。


为什么要使用复杂的正则表达式,其他开发人员很难阅读。如果我必须调试该代码,我会讨厌它。


我觉得像下面这样的东西会更具可读性,并且也会减少错误的机会,并且易于调试:


public double sumFile(String filename) {

    try (Stream<String> linesStream = Files.lines(Paths.get(filename))) {

        return linesStream.mapToDouble(this::sumLine).sum();

    } catch (IOException e) {

        e.printStackTrace();

    }

    return 0;

}


private double sumLine(String line) {

    return Arrays.stream(line.split(","))

            .filter(e -> e.split("\\.").length <= 2)

            .mapToDouble(Double::parseDouble)

            .sum();

}


查看完整回答
反对 回复 2023-09-13
?
白衣非少年

TA贡献1155条经验 获得超0个赞

错误数字的子串实际上有效的问题。“1.2.3”应该被忽略,但如果您只是盲目地寻找有效数字,那么这个数字可能包含“1.2”或“2.3”作为有效数字。

有两种方法可以避免这种情况:

  1. 用已知的分隔符“,”分割该行,并验证每个部分是否有效

  2. 搜索有效和无效的号码并丢弃无效的号码。

    为此,您可以使用正则表达式-?\d+\.?\d*(\.d*)?,并在匹配组非空时丢弃结果。


查看完整回答
反对 回复 2023-09-13
  • 3 回答
  • 0 关注
  • 68 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信