Выделяем числа

  • 10
  • Недоступна
Считать с консоли 2 имени файла. Вывести во второй файл все числа, которые есть в первом файле. Числа выводить через пробел. Закрыть потоки. Пример тела файла: 12 text var2 14 8v 1 Результат: 12 14 1
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (161)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Sergey Bezverkhniy19 уровень, Кишинев-Ямбург
11 января, 04:38
1. Читаем имя файлов. 2. Создаем потоки чтения и записи. 3. Создаем stringBuilder 4. Пока читается while(fr.ready()){ , то что читается(int data) добавляем в stringBulder.append((char)data); 5. Создам pattern (что ищем), где ищем matcher (stringBuilder.toString()); Если нашли записываем то что нашли (matcher.group().trim()+" "); Все!
Михаил22 уровень, Санкт-Петербург
24 декабря 2019, 14:46
Кодировка многим нервы потрепала.... 😀
Ivan19 уровень
12 декабря 2019, 13:56
Я потратил 1 день своей жизни на изучение регулярных выражений и решения этой задачи. Вот что я советую 1. Посмотреть этот цикл видео о регулярных выражениях. Или этот. Хотя бы первые 3-4 видео 2. Пройти краткий курс по regex. Полезно и для других языков программирования 3. Проверять свои варианты решения регулярных выражений здесь. Обратите внимание, что там есть и code generator для java. Если правильно составили регулярное выражение, но пока не знаете как его правильно написать на джаве, то это очень поможет По задаче: 1. Создаём потоки чтения имени файлов, чтения из файла и записи в файл 2. Создаём pattern и вводим туда правильный regex 3. Создаём, но пока не определяем matcher 4. Создаём цикл while, который работает пока есть, что считывать в файле 5. Читаем строку из файла (разделяя каждый её элемент пробелом) в новый массив строк : String[] array = filereader.readLine().split(" ") 6. Запускаем цикл for во всю длину массива, где мы Определяем matcher как pattern.matcher (элемент массива [i]) Если есть совпадение (matcher.find){ То мы пишем в новый файл этот элемент массива i И ещё пишем пробел 7. Закрываем потоки
Dark_Side19 уровень, Нижний Новгород
28 декабря 2019, 17:19
Оч крутые видосики) намного понятнее, чем в лекциях
PumpyJumpy22 уровень, Краснодар
22 ноября 2019, 07:59
Жму пятюню этой задачке.
Евгений20 уровень, Днепр
14 октября 2019, 18:34
Жесть какая-то ( (^\\d+)|(\\s\\d+\\s)|(\\s\\d+$) fileWriter.write(matcher.group().trim() + " ")
Maxim Levin26 уровень, Шэньчжэнь
23 ноября 2019, 07:34
Можно гораздо проще записать - "\\b\\d+\\b" где \\b выражает любой символ разделяющий слова (word boundary), в том числе учитывается начало и конец файла.
Олег26 уровень, Минск
5 декабря 2019, 11:57
Такой не проходит, кириллица ломает этот код
Andrey27 уровень, Астрахань
19 декабря 2019, 11:12
(?<!\S)\d+(?!\S)
RomanBk19 уровень
14 января, 19:08
Написал сначала такое же, но без +. Цифры находило по отдельности. Плюсик приклеивает следующий символ, если он цифра?
Alex Shaposhnikov28 уровень, Минск
27 сентября 2019, 16:00
Проверка: является ли строка числом! public static boolean isNumber(String str) { if (str == null || str.isEmpty()) return false; for (int i = 0; i < str.length(); i++) { if (!Character.isDigit(str.charAt(i))) return false; } return true; } Сохраните себе в файлик на будущее, может не раз понадобится. Будет готовый метод который можно использовать. Простой и лаконичный, найден на просторах интернета) Мир не без добрых людей!
boroda25 уровень, Ижевск
29 сентября 2019, 18:06
7 строк кода можно заменить на 1 и проверять регуляркой
omat_kisat22 уровень, MIPS Assembly
2 октября 2019, 12:33
я тоже рекомендую лучше .matches("\\d+") сохранить на будущее.
LuneFox23 уровень, Москва
2 октября 2019, 13:18
Сохранить к себе в голову, если быть точным)
MartyMcAir30 уровень
15 сентября 2019, 17:38
интересно что в Netbeans через регулярку результ: 12 14 1, а в Intellij Idea результ 12 14 8 1 - но валидатор пропускает, что не так непонятно. Почему регулярка в разных IDE дает разный результ.!?
omat_kisat22 уровень, MIPS Assembly
3 октября 2019, 14:03
метод matches() с регулярным выражением \d+ даст вам false в любом IDE, если соответствующая строка содержит что угодно помимо цифр. Но я не рекомендую использовать его для сплита, сплит лучше сделать по пробелам, а к строке для записи уже добавлять проверкой на matches().
Игорь Гакотин38 уровень, Москва
10 сентября 2019, 09:40
Решил проблему с восьмеркой следующим образом. Как я понял по-умолчанию класс Pattern не поддерживает Unicode и работает только с US-ASCII. Поддержка Unicode включается специальном флагом.
Pattern pattern = Pattern.compile("\\b(-?\\d+)\\b", Pattern.UNICODE_CHARACTER_CLASS);
Владимир Плеханов26 уровень, Самара
13 декабря 2019, 11:01
Спасибо!
Михаил22 уровень, Санкт-Петербург
24 декабря 2019, 14:44
это все прекрасно, а как вы строку смогли прочитать правильно с кириллицей, если FileReader и BufferedReader не умеют сразу прочитать в правильной кодовой таблице. Засада то в этом, а не во флаге UNICODE_CHARACTER...
Nordis27 уровень, Санкт-Петербург
11 августа 2019, 14:16
С таким паттерном ("\\b\\d+\\b"). У меня в файл записывает 12 14 8 1 , а по заданию должен 12 14 1 . Но Валидацию прошёл успешно. Странно , дело в том что я пытался на протяжении нескольких часов убрать эту 8 -ку . И у меня не получалось . Думаю дай так попробую , может прокатит...и Вуаля! Я даже создал паттерн с lookahead и lookbehind ("(?<=\\b)\\d+(?=\\b)") . Дабы что бы 100% убрать 8 -ку. А она всё равно есть! Я так понимаю это с кодировкой символа что то не так . Так как после 8 стоит ю .Кирилица. Я заменял на латиницу , и тогда пропадала 8 -ка . Короче этот момент мне не понятен.
Денис Бурков26 уровень, Москва
18 августа 2019, 15:21
Та же самая ситуация.
Aрамаc34 уровень, Самара
19 августа 2019, 18:29
Да, дело в кодировке. Попробовал в нотпаде преобразовать исходный файл из UTF-8 в ANSI и сохранил. Восьмерка появилась. Преобразовал обратно в UTF-8 без BOM, и восьмерка пропала. Видимо, незнакомые символы в анси интерпретируются, как граница слова.
Максим20 уровень
29 августа 2019, 08:42
Где найти все эти паттерны?
Nordis27 уровень, Санкт-Петербург
29 августа 2019, 17:31
Их не находят . Их придумывают , но для того что бы написать свою регулярку . Нужно знать что и как писать . Советую к просмотру курс из 10 уроков у этого Автора Тут
Роман Князев22 уровень, Санкт-Петербург
12 июня 2019, 16:51
Нам нужно спарсить числа, зачем тут использовать регулярные выражения? У меня метода 1. Записываем все в строку 2. Строку разбиваем в массив по пробелу 3. по всему массиву проходимся
try {
    String X = Integer.parseInt(e) + " ";
    fileWriter.write(X);
}
catch (Exception c){ }
Как следствие, если можем преобразовать в число, то пишем в файл, если нет, то ошибка на пропускает нас на следующую итерацию.
Alexey Matias32 уровень, Санкт-Петербург
16 июля 2019, 18:35
Только в случае, когда мы используем regex, мы записываем еще лишний пробел в конец файла
Ivan34 уровень, Нижний Новгород
16 июля 2019, 18:39
так в try..catch ведь тоже самое, разве нет?
Alexey Matias32 уровень, Санкт-Петербург
16 июля 2019, 19:08
Ваша правда)
LuneFox23 уровень, Москва
2 октября 2019, 13:21
Это что, программа, алгоритм которой построен на ожидаемом исключении?