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

  • 10
  • Недоступна
Считать с консоли 2 имени файла. Вывести во второй файл все числа, которые есть в первом файле. Числа выводить через пробел. Закрыть потоки. Пример тела файла: 12 text var2 14 8v 1 Результат: 12 14 1
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (155)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Ivan19 уровень
четверг, 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. Закрываем потоки
PumpyJumpy20 уровень, Краснодар
22 ноября, 07:59
Жму пятюню этой задачке.
Евгений20 уровень, Днепр
14 октября, 18:34
Жесть какая-то ( (^\\d+)|(\\s\\d+\\s)|(\\s\\d+$) fileWriter.write(matcher.group().trim() + " ")
Maxim Levin25 уровень, Шэньчжэнь
23 ноября, 07:34
Можно гораздо проще записать - "\\b\\d+\\b" где \\b выражает любой символ разделяющий слова (word boundary), в том числе учитывается начало и конец файла.
Олег20 уровень, Минск
5 декабря, 11:57
Такой не проходит, кириллица ломает этот код
Alex Shaposhnikov28 уровень, Минск
27 сентября, 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 сентября, 18:06
7 строк кода можно заменить на 1 и проверять регуляркой
omat_kisat22 уровень, MIPS Assembly
2 октября, 12:33
я тоже рекомендую лучше .matches("\\d+") сохранить на будущее.
LuneFox23 уровень, Москва
2 октября, 13:18
Сохранить к себе в голову, если быть точным)
MartyMcAir24 уровень
15 сентября, 17:38
интересно что в Netbeans через регулярку результ: 12 14 1, а в Intellij Idea результ 12 14 8 1 - но валидатор пропускает, что не так непонятно. Почему регулярка в разных IDE дает разный результ.!?
omat_kisat22 уровень, MIPS Assembly
3 октября, 14:03
метод matches() с регулярным выражением \d+ даст вам false в любом IDE, если соответствующая строка содержит что угодно помимо цифр. Но я не рекомендую использовать его для сплита, сплит лучше сделать по пробелам, а к строке для записи уже добавлять проверкой на matches().
Игорь Гакотин31 уровень, Москва
10 сентября, 09:40
Решил проблему с восьмеркой следующим образом. Как я понял по-умолчанию класс Pattern не поддерживает Unicode и работает только с US-ASCII. Поддержка Unicode включается специальном флагом.
Pattern pattern = Pattern.compile("\\b(-?\\d+)\\b", Pattern.UNICODE_CHARACTER_CLASS);
Владимир Плеханов19 уровень, Самара
позавчера, 11:01
Спасибо!
Nordis27 уровень, Санкт-Петербург
11 августа, 14:16
С таким паттерном ("\\b\\d+\\b"). У меня в файл записывает 12 14 8 1 , а по заданию должен 12 14 1 . Но Валидацию прошёл успешно. Странно , дело в том что я пытался на протяжении нескольких часов убрать эту 8 -ку . И у меня не получалось . Думаю дай так попробую , может прокатит...и Вуаля! Я даже создал паттерн с lookahead и lookbehind ("(?<=\\b)\\d+(?=\\b)") . Дабы что бы 100% убрать 8 -ку. А она всё равно есть! Я так понимаю это с кодировкой символа что то не так . Так как после 8 стоит ю .Кирилица. Я заменял на латиницу , и тогда пропадала 8 -ка . Короче этот момент мне не понятен.
Денис Бурков26 уровень, Москва
18 августа, 15:21
Та же самая ситуация.
Арзамас31 уровень, Самара
19 августа, 18:29
Да, дело в кодировке. Попробовал в нотпаде преобразовать исходный файл из UTF-8 в ANSI и сохранил. Восьмерка появилась. Преобразовал обратно в UTF-8 без BOM, и восьмерка пропала. Видимо, незнакомые символы в анси интерпретируются, как граница слова.
Максим20 уровень
29 августа, 08:42
Где найти все эти паттерны?
Nordis27 уровень, Санкт-Петербург
29 августа, 17:31
Их не находят . Их придумывают , но для того что бы написать свою регулярку . Нужно знать что и как писать . Советую к просмотру курс из 10 уроков у этого Автора Тут
Роман Князев22 уровень, Санкт-Петербург
12 июня, 16:51
Нам нужно спарсить числа, зачем тут использовать регулярные выражения? У меня метода 1. Записываем все в строку 2. Строку разбиваем в массив по пробелу 3. по всему массиву проходимся
try {
    String X = Integer.parseInt(e) + " ";
    fileWriter.write(X);
}
catch (Exception c){ }
Как следствие, если можем преобразовать в число, то пишем в файл, если нет, то ошибка на пропускает нас на следующую итерацию.
Alexey Matias31 уровень, Санкт-Петербург
16 июля, 18:35
Только в случае, когда мы используем regex, мы записываем еще лишний пробел в конец файла
Ivan34 уровень, Нижний Новгород
16 июля, 18:39
так в try..catch ведь тоже самое, разве нет?
Alexey Matias31 уровень, Санкт-Петербург
16 июля, 19:08
Ваша правда)
LuneFox23 уровень, Москва
2 октября, 13:21
Это что, программа, алгоритм которой построен на ожидаемом исключении?
Anton Rymarenko31 уровень
5 июня, 17:22
можно сделать через паттерн ,кстати полездно будет с ним познакомиться.а можно парсить через кетч блок .и да split("\\w") не пройдет , он не видит кириллици,на сколько я понял .Не повторяйте моих ошибок)))
skybright40 уровень
29 мая, 17:56
Эту (3) решил без подсказок, так как всерьез стал вчитываться в статью Кажется начал понимать.