Regex для получения двойных чисел из файла, но игнорируя те, которые имеют несколько точек - PullRequest
0 голосов
/ 01 октября 2019

Получить все двойные числа в файле и вернуть сумму, но избегать значений с несколькими точками.

Контрольный пример:

В файле

12.3,123.45,19,2.16.8.1.1

output

Ожидаемый результат -> 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

Ответы [ 2 ]

0 голосов
/ 01 октября 2019

Вы можете использовать

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

См. Демоверсию regex

Подробности

  • -?- необязательный дефис
  • (?<!\d|\d\.) - сразу слева, не должно быть цифр или цифр + .
  • \d* - 0+ цифр
  • \.? - дополнительная точка
  • \d+ - 1+ цифр
  • (?!\.?\d) - сразу вправо, не должно быть цифры или . + цифра.
0 голосов
/ 01 октября 2019

Проблема в том, что подстрока ошибочных номеров действительно действительна. «1.2.3» следует игнорировать, но если вы просто слепо ищете действительные числа, то это может содержать «1.2» или «2.3» в качестве действительных чисел.

Есть два способа избежать этого:

  1. разбить строку по известному разделителю "," и изменить для каждой части, если она действительна или нет или
  2. Найти обадопустимые и недействительные числа и отбрасывают недопустимые числа.

    Для этого вы можете использовать регулярное выражение типа -?\d+\.?\d*(\.d*)? и отбрасывать результат, когда соответствующая группа не пуста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...