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

检索文件中的所有双精度数字并返回总和,但避免使用多个点的值。


测试用例 :


在文件中


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


小怪兽爱吃肉
浏览 72回答 3
3回答

海绵宝宝撒

您可以使用-?(?<!\d)(?<!\d\.)\d*\.?\d+(?!\.?\d)如果不需要匹配-前面的可选项,则将其删除即可。请参阅正则表达式演示细节-?- 可选的连字符(?<!\d)(?<!\d\.)- 紧靠左边,不应有数字或数字 +.\d*- 0+ 位数字\.?- 一个可选的点\d+- 1+ 位数字(?!\.?\d)- 紧靠右边,不能有数字或.+数字。在 Java 中,使用:Pattern&nbsp;pattern&nbsp;=&nbsp;Pattern.compile("-?(?<!\\d)(?<!\\d\\.)\\d*\\.?\\d+(?!\\.?\\d)");

一只萌萌小番薯

我无法阅读这些正则表达式,它们对于普通人来说太复杂了。为什么要使用复杂的正则表达式,其他开发人员很难阅读。如果我必须调试该代码,我会讨厌它。我觉得像下面这样的东西会更具可读性,并且也会减少错误的机会,并且易于调试:public double sumFile(String filename) {&nbsp; &nbsp; try (Stream<String> linesStream = Files.lines(Paths.get(filename))) {&nbsp; &nbsp; &nbsp; &nbsp; return linesStream.mapToDouble(this::sumLine).sum();&nbsp; &nbsp; } catch (IOException e) {&nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();&nbsp; &nbsp; }&nbsp; &nbsp; return 0;}private double sumLine(String line) {&nbsp; &nbsp; return Arrays.stream(line.split(","))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .filter(e -> e.split("\\.").length <= 2)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .mapToDouble(Double::parseDouble)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .sum();}

白衣非少年

错误数字的子串实际上有效的问题。“1.2.3”应该被忽略,但如果您只是盲目地寻找有效数字,那么这个数字可能包含“1.2”或“2.3”作为有效数字。有两种方法可以避免这种情况:用已知的分隔符“,”分割该行,并验证每个部分是否有效或搜索有效和无效的号码并丢弃无效的号码。为此,您可以使用正则表达式-?\d+\.?\d*(\.d*)?,并在匹配组非空时丢弃结果。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java