Есть строка. Нужно составить регулярное выражение, которое при использовании в replace
с заменой на пустую строку оставит в строке для каждого символа только его первое вхождение в строку. Как это сделать?
Пример. Вход - "у попа была собака"
, выход - "у поа был ск"
.
Первый вариант на основе этого ответа:
String str = "Упопабыласобака";
String result = new StringBuilder(str).reverse().toString();
result = result.replaceAll("(.)(?=.*\\1)", "");
result = new StringBuilder(result).reverse().toString();
System.out.println(result);
Вывод на экран:
Упоабылск
Замена replaceAll("(.)(?=.*\\1)", "")
приводит к сохранению только последнего вхождения символа в строку, поэтому приходится разворачивать строку перед заменой и, соответственно, после замены.
Второй вариант без разворота строки, но с пометкой "не повторяйте этого дома", на основе этого ответа:
String str = "Упопабыласобака";
String pattern = "(.)(?=(.*))(?<=(?=\\1.*?\\1\\2$).+)";
String result = str.replaceAll(pattern, "");
System.out.println(result);
Вывод на экран аналогичен.
Третий вариант без использования рег. выражений (для полноты картины и для сравнения производительности) с использованием HashSet
:
String str = "Упопабыласобака";
Set<Character> set = new HashSet<>();
StringBuilder sb = new StringBuilder();
for (char c : str.toCharArray())
{
if (!set.contains(c))
{
set.add(c);
sb.append(c);
}
}
String result = sb.toString();
Тест на строке из 10k символов (код генерации строки можно посмотреть здесь):
1: 220мс
2: 1250мс
3: 2мс
Тест на строке из 100к символов:
1: 19000мс
2: >60000мс
3: 5мс
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Задача, через Java поменять цвет монитора на конкретно заданныйДопустим, красный
Есть какие-нибудь инструменты для Java, чтобы отслеживать события, которые произошли в приложении (нажатие кнопки, выбор элемента в JList, закрытие...
Нужно чтобы при каждой итерации цикла в формулах a и b менялся первый элемент с Aget(0) и A