С данным шаблоном совпадает любая строка, удовлетворяющая следующим условиям:
- длина строки не менее 3 символов;
- как минимум один символ внутри строки является цифрой.
Неэкранированная точка в регулярном выражении означает любой символ. Символ "+" - это квантифокатор, который означает "один или более раз". Следовательно, регулярное выражение ".+" следует понимать как "один или несколько любых символов". Такая конструкция имеется в начале и конце шаблона, а значит, в строке должно быть минимум два символа (по количеству "плюсов"). Выражение в квадратных скобках - это символьный класс, обязывающий предусмотреть один любой из перечисленных в нём символов (в данном случае одну из цифр). Прибавив этот символ к двум "плюсам", получим минимальную длину строки, равную 3.
Метод replaceAll() употребляется в данном коде некорректно. В контексте кода перепутаны следующие одноименные методы:
1) метод интерфейса List, предназначенный для замены каждого элемента списка результатом некоторой операции. Принимает один аргумент. Синтаксис использования этого метода следующий:
List<Integer> list =newArrayList<>();for(int i =0; i <20; i++){// заполняем список значениями от 0 до 19
list.add(i);}
list.replaceAll(i -> i +2);// заменяем каждый элемент списка значением, увеличенным на 2
list.forEach(System.out::println);
2) метод класса String, предназначенный для замены последовательности символов в строке. Принимает два аргумента. Заменяет все вхождения в строке, соответствующие регулярному выражению (regex), на некоторую последовательность символов (replacement).
Ошибка возникает оттого, что на объекте списка fileContent производится попытка вызвать метод класса String (с двумя аргументами).
Помимо некорректного вызова метода replaceAll() в коде имеются ещё две ошибки компиляции.
1. Переменная fileName не инициализирована значением по умолчанию. Поскольку присваивание ссылки этой переменной зависит от результата вызова reader.readLine(), то нет гарантии, что переменная получит ссылку на строку. Например, если при выполнении метода readLine() произойдёт ошибка и метод выбросит исключение, то переменная fileName так и останется не инициализированной, а код программы продолжит выполняться дальше. В результате программа гарантированно "рухнет" в 32 строке при попытке передачи в конструктор FileReader несуществующей ссылки.
Чтобы устранить эту ошибку, следует инициализировать переменную fileName при объявлении (например, пустой строкой). Другой способ, на мой взгляд, более корректный в данном случае - пробросить исключение IOException, "завернув" его, к примеру, в RuntimeException:
Если исключение IOException будет выброшено, выполнение программы гарантированно прервётся, поэтому начальная инициализация fileName в данном случае не требуется.
2. Переменная result существует только внутри тела цикла, в котором объявлена, т. е. она "не видна" при вызове System.out.print(result). Ситуацию можно исправить, перенеся вывод в консоль внутрь цикла.