Слова с цифрами

  • 10
  • Недоступна
В метод main первым параметром приходит имя файла1, вторым - файла2. Файл1 содержит строки со словами, разделенными пробелом. Записать через пробел в Файл2 все слова, которые содержат цифры, например, а1 или abc3d. Закрыть потоки.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (256)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Фантомас19 уровень, Киев
позавчера, 17:15
Благодаря задаче узнал про проверку с паттерном в одну строку.
if (args[0] != null && args.length == 2) {

   try (BufferedReader reader = new BufferedReader(new FileReader(args[0]));
        BufferedWriter writer = new BufferedWriter(new FileWriter(args[1]))) {

       String line;

        while ((line = reader.readLine()) != null) {
              List<String> list = new ArrayList<>(Arrays.asList(line.split(" ")));

              for (String word : list) {
                  if (Pattern.compile("\\d+").matcher(word).find()) {
                     writer.write(word + " ");
                  }
              }
        }
   } catch (IOException e) { e.printStackTrace(); }
}
Александр20 уровень, Екатеринбург
четверг, 05:29
На лету делим считанную строку сплитом по пробелу в массив, затем бежим по массиву с проверкой .matches("^(?U)\\D*\\d.*$") (что означает - хотя-бы один цифровой символ в строке, в кодировке utf-8. При этом не нужно аппендить строки в файлрайтере, иначе валидол сомневается в корректном использовании оного (интересно послушать мнение Знатоков на этот счет). И еще райтер не буферизировал. 12 строчек со скобочками.
Дмитрий20 уровень, Омск
12 февраля, 11:09
Пожалуйста объясните мне этот бред!
Дмитрий20 уровень, Омск
12 февраля, 11:19
не используйте FileWriter fileWriter = new FileWriter(args[1], true) используйте FileWriter fileWriter = new FileWriter(args[1])
Badadach20 уровень, Москва
пятница, 10:32
А что значит конструкция \\p{P} в вашей регулярке?
Denis Sidorenko22 уровень, Новосибирск
9 февраля, 06:57
Крч, 18 попыток. Для тех, кто хочет жить: 1) Условие задачи по-русски: Записать через пробел в Файл2 все слова(цифры, числа, слова+числа, слова+числа+знаки пунктуации), которые содержат цифры, например, а1 или abc3d.(из-за таких примеров хочется выйти в окно. -> соответственно сделав split(" ") - вы попадёте в точку; Т.е. например файл содержит Eto stoit 1 bax, a vot eto - 12 . Peremennaya imeet imya file1. 110 - eto chislo. На выходе: 1 12 file1. 110 2) Никаких флагов true для до записи в файл 3) "\\d+" в связке Pattern, Matcher ->find - > write (в моем случае ещё и зафлушил мазиком, чтоб валидатор не обоср**ся в сотый раз, и переварил хорошо) 4) закрываем reader, writer (закрывал в такой последовательности, ибо была задача, где закрыл наоборот, валидатор слал очень далеко. (использовать try - catch - resourse не рискнул, мало ли не переварит) 5) Берегите ваши нервы, они вам пригодятся, и не повторяйте таких результатов Задача успешно прошла тестирование! Вы решили задачу лучше, чем 0% учеников. Вам удалось ее решить с 18 попытки. Среднее количество попыток для этой задачи 2.58. Всего эту задачу решили 11153 учеников. p.s. Peace😇 6. А и да, для красавчиков, которые как и я последний элемент писали не вставляя пробел после него, забейте ***, пишите в файле s+" " и не парьтесь, валидатор не ростовский гаишник, штрафовать не будет за такие мелочи. + никаких махинаций с кодировками не делал, ликвидатору тоже пофигу, он полиглот.
Badadach20 уровень, Москва
пятница, 10:16
А что такие гаишники в Ростове лютые?) Вроде нет))) Это в Краснодаре лютые а в Ростове за мелочи не трогают меня особо)))
Koval22 уровень, Брест
6 февраля, 16:05
Если вы не горите желанием тратить несколько часов дабы ублажить валидатор то вот
[\w\p{P}]*\d+[\w\p{P}]*
[\w\p{P}]* -до числа может быть сколько угодно букв(\w)и знаков препинания(\p{P}) \d+ -само число(минимум одна цифра) [\w\p{P}]* - после числа может быть сколько угодно букв и знаков препинания\ Только с русскими словами не работает, но на это валидатору пох, главное что бы в слова знаки пунктуации входили
Anton Rymarenko34 уровень
11 февраля, 11:07
Pattern pattern = Pattern.compile("[0-9]");
ondutytoday22 уровень, Самара
11 февраля, 17:39
или так Pattern pattern = Pattern.compile("\\d+");
Александр20 уровень, Екатеринбург
четверг, 05:45
"^(?U)\\D*\\d.*$" с учетом кодировки хотя-бы один \\d в любом месте строки
almariel120 уровень, Москва
5 февраля, 19:50
Так гордилась своей регуляркой для сплита [\p{Space}\p{Punct}]+ А оказалось, знаки препинания должны оставаться, и все гораздо проще. Спасибо за прозрачные условия и наглядные примеры в них :(
LonWoLonWo20 уровень, Санкт-Петербург
29 января, 10:24
Ну и для кого я два часа писала регулярку, которая проверяет, чтобы и буквы(включая кириллицу) и цифры были в слове? 😠 (?=([А-Яа-яЁёA-Za-z]*[0-9])+)([a-zA-ZА-Яа-яЁё0-9]{2,}) - не используйте её. но мало ли кому пригодится
Иван Ганжа22 уровень, Москва
8 января, 01:05
я один делал через Character.isDigit() ?
Алек29 уровень, Москва
30 декабря 2019, 11:13
Вот это решение Александра от 4 мая: \b\S*\d+\S*\b мне кажется единственным правильным решением для данной задачи с учётом того что от нас хотели. То что всё пишут про (.*\\d+.*) - это вообще не работает при поиске слов в каком-либо тексте. Работает только в уже разбитом массиве, хотя может так и правильнее..кто знает.
Andrey32 уровень, Астрахань
25 декабря 2019, 11:41
из коментов понял, что необходимо включать знаки пунктуации. по идее слово может содержать символ "-" и символ "`". но делать еще одну регулярку с учетом ТОЛЬКО этих двух символов я конечно не буду.