Как удалить все одинаковые символы в ворде
Перейти к содержимому

Как удалить все одинаковые символы в ворде

  • автор:

Как удалить из строки все последующие повторяющиеся слова?

Не получается удалить из строки все последующие повторяющиеся слова, оставляя только первые слова. Пробовала и с использованием массива, добралась до регулярных выражений. Я только учусь, поэтому прошу помощи разобраться.

public static String removeConsecutiveDuplicates(String s) < String str = ""; Pattern p = Pattern.compile("(?i)(\\b\\w+\\b)(.*?) \\b\\1\\b"); Matcher m = p.matcher(s); while (m.find()) < s = m.replaceAll("$1$2"); m = p.matcher(s); >System.out.println(s); > 

частое выражение (?i)(\b\w+\b)(.*?) \b\1\b находит все повторяющиеся слова. Но мне нужно чтобы первое вхождение не удалялось. Например строка пришла :

"alpha beta beta gamma gamma gamma delta alpha beta beta gamma gamma gamma delta" 

Мне нужен вывод после работы моей программы

"alpha beta gamma delta alpha beta gamma delta" 

Мой код выводит

alpha beta gamma delta 

Как мне вообще лучше добиться достижения результата?
Отслеживать
7,829 13 13 золотых знаков 25 25 серебряных знаков 56 56 бронзовых знаков
задан 28 янв 2022 в 12:04
17 4 4 бронзовых знака

1) разбить строку на массив слов 2) убрать дубликаты из массива (можно фильтрануть через хешсет) 3) собрать из отфильтрованных слов новую строку

28 янв 2022 в 13:13
Да, я делала так, но увы это не сработала для меня. Все тесты не проходят.
31 янв 2022 в 7:48

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Для обнаружения слов, следующих друг за другом, нужно использовать обратные ссылки \1 , так что результата можно достичь достаточно простым выражением. Может понадобиться два прохода, чтобы корректно обработать повторения в начале и конце строки.

public static String removeConsecutiveWords(String str)

Здесь «слово» определено в первой группе (\\b\\w+\\W+) или (\\W*\\w+\\b) , а его повторения — при помощи обратной ссылки (\\1)+ во второй группе, которые соответственно заменяются на первую группу $1 .

String str = "alpha alpha beta beta gamma gamma gamma delta alpha beta beta gamma gamma gamma delta delta"; System.out.println(removeConsecutiveWords(str)); // -> alpha beta gamma delta alpha beta gamma delta 

Также можно использовать классы \p (Unicode-буквы) и \P (не-буквы) для поиска слов, включающих не только стандартные английские буквы.

public static String removeConsecutiveWords(String str) < return str .replaceAll("(?i)(\\b\\p+\\P+)(\\1)+", "$1") .replaceAll("(?i)(\\P*\\p+\\b)(\\1)+", "$1"); // > String str = "альфа альфа бета бета гамма гамма гамма дельта альфа альфа"; System.out.println(removeConsecutiveWords(str)); // -> альфа бета гамма дельта альфа 

Если между одинаковыми словами могут находиться разные последовательности пробельных символов (которые можно игнорировать), то предыдущий подход не сработает, и лучше будет воспользоваться вложенными циклами и Matcher::find(int start) :

public static String removeConsecutiveWordsOnly(String str) < StringBuilder sb = new StringBuilder(); Pattern p = Pattern.compile("(\\p+)\\b(\\P*)"); Matcher m = p.matcher(str); int start = 0; while (m.find(start)) < String w1 = m.group(1); String d1 = m.group(2); sb.append(w1).append(d1); start = m.end(2); while(m.find(start) && w1.equalsIgnoreCase(m.group(1))) < start = m.end(2); // пропустить слово и его разделитель >> return sb.toString(); > String str = "Alpha alpha;\tальфа альфа\tбета - Бета,БЕТА Delta gamma gamma gamma delta delta"; System.out.println("'" + removeConsecutiveWordsOnly(str) + "'"); // -> 'Alpha альфа бета - Delta gamma delta ' System.out.println("'" + removeConsecutiveWords(str) + "'"); // -> 'Alpha alpha; альфа альфа бета - Бета,БЕТА Delta gamma delta' 

Как удалить одинаковые буквы из строки? — Java SE

Видимо я пытаюсь заменить char на string, поэтому и не работает. Пожалуйста, подскажите как мне реализовать эту функцию. Пример работы, должно быть так: на входе — Java на выходе — Jv То есть должны удаляться все символы, встречающиеся более 1 раза

Отслеживать
Nikita Kalugin
задан 24 сен 2017 в 6:38
Nikita Kalugin Nikita Kalugin
167 1 1 серебряный знак 13 13 бронзовых знаков

Это в корне меняет дело. Регистр учитывать? Неалфавитные символы в строке встречаться могут? Какой набор символов используется?

24 сен 2017 в 9:15
Нет, регистр не важен, да, символы встречаться могут. Набор символов: [a-z] [а-я] [0-9]
24 сен 2017 в 9:20

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

String str = "Java 8 RulezZz"; Map frequencies = str.toLowerCase() .codePoints() .boxed() .collect(Collectors.groupingBy( Function.identity(), Collectors.counting())); String duplicates = frequencies.entrySet() .stream() .filter(e -> e.getValue() > 1) .map(Map.Entry::getKey) .map(Character::toChars) .map(String::valueOf) .filter(i -> !i.equals(" ")) .collect(Collectors.joining()); System.out.println(str.replaceAll("(?i)[" + duplicates + "]", "")); 

Код в основном использует появившееся в Java 8 механизмы функционального программирования — Stream API, лямбды и ссылки на методы. Google поможет найти огромное количество вводных статей в эту область. Если хочется ознакомиться с вопросом подробнее, могу посоветовать учебник Уорбэртона «Лямбда-выражения в Java 8» или «Java SE 8 Базовый курс» Хорстманна. Попробую разобрать пример построчно:

str.codePoints() — вызов метода codePoints() возвращает поток элементов типа int . Каждый элемент представляет код символа в оригинальной строке.

Вызов boxed() упаковывает каждый int в потоке в Integer.

Вызов collect() — терминальная операция преобразующая поток во что-либо. В данном случаем мы передаём параметром предопределённый коллектор groupBy , использующийся для группировки элементов.

Первым параметром коллектора мы передаём результат вызова статического метода Function.identity() , который возвращает лямбда-выражение, в свою очередь, возвращающее без изменений всё, что ему передадут. Можно было вместо Function.identity() написать i -> i .

Вторым параметром коллектора мы передаём результат вызова статического метода Collectors.counting() , который возвращает коллектор подсчитывающий количество элементов в потоке.

В результате манипуляций с этим потоком мы получаем в переменную frequencies отображение (Map), содержащий в ключах коды символов, а в значениях количество раз, который этот код встретился в потоке:

Вызов frequencies.entrySet() возвращает множество элементов отображения, которое мы тут же преобразуем в новый поток вызовом stream() .

В следующей строке — filter(e -> e.getValue() > 1) мы отфильтровываем элементы значения которых равны единицы, то есть встретились в первом потоке только один раз.

Вызов map(Map.Entry::getKey) отбрасывает значения элементов, оставляя в потоке только ключи, так как значения нам больше не нужны, мы уже использовали их для фильтрации на предыдущем шаге.

Вызов map(Character::toChars) преобразует коды символов в сами символы.

Вызов map(String::valueOf) преобразует символы в строки.

Вызов filter(i -> !i.equals(» «)) отфильтровывает пробелы. Мы же не хотим, чтобы в результате удаления дублирующихся пробелов в нашей итоговой строке все слова слиплись.

И, как и прошлый, этот поток заканчивается коллектором — .collect(Collectors.joining()) , но на этот раз объединяющим отдельные строки потока в одну результирующую.

В результате манипуляций со вторым потоком мы получаем строку, содержащую все символы, которые встретились в оригинальной строке более одного раза, исключая пробелы.

Вызовом метода String.replaceAll() мы разом удаляем из str все символы duplicates . Первым параметром метод получает регулярное выражение. Его первая часть — (?i) означает, что метод должен игнорировать регистр символов. Вторая часть, образующаяся в результате конкатенации — [az] представляет набор символов, которые надо заменить. Вторым параметром метода передаётся строка, на которую эти символы необходимо заменить. Так как нам надо их удалить, то заменяем мы их на пустую строку.

Или можно в императивном стиле:

Map chars = new HashMap<>(); StringBuilder sb = new StringBuilder(); for (char c : str.toLowerCase().toCharArray()) < if (c != ' ') chars.merge(c, 1, Integer::sum); >sb.append("(?i)["); for (Map.Entry entry : chars.entrySet()) < if (entry.getValue() >1) sb.append(entry.getKey()); > sb.append("]"); System.out.println(str.replaceAll(sb.toString(), "")); 

Как удалить все одинаковые слова в тексте

Допустим есть текст:
«ааа привет! ааа как дела? ааа чем занимаешься? ааа» и т.д. Надо удалить «ааа»
Текст большой(более 80 тыс символов), поэтому простой поиск и удаление не подходит подскажите софт/сервис, чтобы удалить все одинаковые слова

Лучший ответ

В редакторах есть инструмент поиск и замена Ctrl + H.
В строке «Поиск» вводишь:
ааа (если надо, с пробелами)
А «Заменить на»:
пустой оставь

После не спеши, нажимай сначала «Заменить», если результат какой нужно, дальше «Заменить все. «

Alex ЖaPuKoBМастер (1659) 13 лет назад
Спасибо, но слишком долго, комп виснет и нет гарантии, что процесс завершится успешно.

nobody Мудрец (11374) Самая клевая программа, которая открывает документы большого размера, — это UltraEdit. Можно через поисковые сервера найти, скачать и установить. К примеру, открывал документы размером 700 Мб.

DP_88Профи (763) 9 лет назад

текст был на 40 000 слов. От фонаря была разбросана буква гэ, которая с хвостиком (не знаю где она на раскладке) 900 раз на 40 000 слов, полный рандом. с помощью твоего способа за 4 сек я их всех удалил. МУжик, огромное спасибо.

Удаление одинаковых значений в Google Таблицах

Удаление одинаковых значений в Google Таблицах

При заполнении листа в Google Таблицах может оказаться, что некоторые значения повторяются и быть такого не должно. В таких случаях можно самостоятельно просматривать все ячейки и удалять одинаковые, но это далеко не всегда удобно, особенно если речь идет об одновременной обработке большого массива данных. Поэтому лучше обратиться к автоматизированным средствам поиска и удаления дубликатов, о которых и пойдет речь в этой статье.

Применение функции очистки данных

Разработчики Google Таблиц добавили интересную функцию, которая позволяет без лишних формул и фильтров очистить повторы в выделенном диапазоне ячеек. Это самый простой и быстрый метод, поэтому хотелось бы остановиться на нем в первую очередь.

  1. С зажатой левой кнопкой мыши выделите все ячейки, среди которых хотите найти повторы. Затем на верхней панели разверните меню «Данные». Выбор ячеек для удаления повторов в Google Таблицах
  2. В списке наведите курсор на «Очистка данных» и выберите пункт «Удалить повторы». Выбор функции удаления повторов в Google Таблицах
  3. В появившемся окне не нужно добавлять никаких изменений, поскольку вы изначально уже выделили необходимые для обработки ячейки. Просто нажмите кнопку «Удалить повторы». Настройка удаления повторов в Google Таблицах
  4. Уже через секунду вы увидите информацию о том, сколько повторяющихся строк найдено и сколько уникальных осталось. Можете вернуться к таблице и самостоятельно убедиться в успешности выполненной задачи. Успешное удаление повторов в Google Таблицах

Комьюнити теперь в Телеграм
Подпишитесь и будьте в курсе последних IT-новостей

Использование специальной функции

Второй метод подразумевает ввод специальной функции, при помощи которой проверяются значения в ячейках и в отдельном столбце выводятся только уникальные. Этот вариант является отличной альтернативой предыдущему.

  1. Вам достаточно будет выбрать пустой столбец, выделить в нем ячейку и ввести формулу =UNIQUE(A1:A10), где A1:A10 – диапазон ячеек со значениями для проверки. Создание функции для удаления повторов в Google Таблицах
  2. После нажатия по клавише Enter вы увидите, что формула уже вступила в силу и в каждой следующей строке столбца выведены исключительно уникальные значения из выбранного диапазона. Применение функции удаления повторов в Google Таблицах
  3. Старый столбец больше не нужен, поэтому можно щелкнуть по нему правой кнопкой мыши и из появившегося контекстного меню выбрать пункт «Удалить строки». Удаление оригинальных ячеек после поиска повторов в Google Таблицах

Создание фильтра

Иногда пользователю удобнее выполнить проверку данных самостоятельно, например, когда нужно удалить не все дубликаты, а только некоторые из них. В таком случае на помощь приходит фильтрация по алфавиту или возрастанию чисел, поскольку все значения будут расставлены по порядку, а одинаковые всегда находиться рядом.

  1. Выделите диапазон с ячейками, нажмите по нему правой кнопкой мыши и выберите пункт «Создать фильтр». Вызов инструмента фильтрации в Google Таблицах
  2. Нажмите по появившемуся значку фильтра и выберите подходящий для вас вариант сортировки. Настройка фильтрации для удаления повторов в Google Таблицах
  3. Вы увидите, как одинаковые значения теперь идут по порядку. Вам остается только найти ненужные и удалить их. Удаление повторов после фильтрации в Google Таблицах

Установка дополнения

Завершающий метод самый долгий по выполнению, поскольку требует некоторое время на подготовку. Он заключается в установке и применении специального дополнения для Google Таблиц, функциональность которого и строится вокруг уникальных и повторяющихся ячеек. Давайте разберемся с этим более детально.

  1. На верхней панели разверните меню «Расширения», наведите курсор на «Дополнения» и выберите пункт «Установить дополнения». Переход к поиску дополнений в Google Таблицах
  2. Через поиск в новом окне найдите дополнение с названием «Remove Duplicates». Поиск дополнения для удаления повторов в Google Таблицах
  3. На его странице нажмите кнопку «Установить» и подтвердите запуск инсталляции. Установка дополнения для удаления повторов в Google Таблицах
  4. Теперь дополнение запускается через то же меню «Расширения», а в его меню вам нужно выбрать метод работы. Я остановлюсь на первом, который подразумевает поиск одинаковых строк. Запуск дополнения для удаления повторов в Google Таблицах
  5. Выделите заранее диапазон или выберите его в окне дополнения. Выбор диапазона в дополнении для удаления повторов в Google Таблицах
  6. В следующем шаге уточните, хотите ли вы найти дубликаты или только уникальные значения. Выбор типа поиска для удаления повторов в Google Таблицах
  7. Задайте дополнительные параметры, если нужно игнорировать заголовок или пустые строки. Выбор дополнительных опций поиска повторов в Google Таблицах
  8. Далее выберите действие для дубликатов или уникальных ячеек. Их можно выделить цветом, переместить, удалить значения или удалить саму строку. Выбор действий для повторов в Google Таблицах
  9. Я выбрал вариант выделения цветом, чтобы найти все повторы. Далее их можно без проблем удалить или переместить, что уже зависит от требований пользователя. Выделение повторов цветом при использовании дополнения в Google Таблицах

После прочтения всех инструкций вы знаете, какой из вариантов оптимален в вашем случае. Как показывает практика, первый практически всегда подходит для удаления дубликатов, а для их простого обнаружения всегда можно использовать фильтр или дополнение.

Читайте также в Комьюнити:

  • Поворот текста в Google Таблицах
  • Создание таблицы посещаемости в Google Таблицах
  • Как убрать сетку в Google Таблицах

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *