Я могу использовать это:
String str = "TextX Xto modifyX";
str = str.replace('X','');//that does not work because there is no such character ''
Есть ли способ удалить все вхождения символа X
из строки в Java?
Я попробовал это и не то, что я хочу str.replace('X',' '); //replace with space
Ответы:
Попробуйте использовать перегрузку, которая принимает
CharSequence
аргументы (например,String
), а неchar
:источник
CharSequence
. docs.oracle.com/javase/7/docs/api/java/lang/…X
тип имеет тип char?toString
сначала тебе это понадобится . Так что ваш код будет выглядеть примерно такstr = str.replace(yourChar.toString(), "");
str = str.replace("\uffff", "");
С помощью
буду работать.
Использование будет
str.replace("X", "");
.проведение
возвращает:
источник
replace
перегрузка, которая требует простогоCharSequence
.Если вы хотите что-то сделать с Java Strings, Commons Lang StringUtils - отличное место для поиска.
источник
replace
.Это пример того, где я удалил персонажа из строки.
источник
Мне нравится использовать RegEx по этому поводу:
где g означает глобальный, поэтому он пройдет всю строку и заменит все X на ''; если вы хотите заменить оба X и x, вы просто говорите:
(см. мою скрипку здесь: скрипка )
источник
Здравствуйте, попробуйте этот код ниже
источник
Используйте replaceAll вместо replace
Это должно дать вам желаемый ответ.
источник
return Pattern.compile(target.toString(), Pattern.LITERAL).matcher( this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
источник
input = "deletes all blanks too";
дает "deletesalllankstoo"вот лямбда-функция, которая удаляет все символы, переданные в виде строки
String str = "TextX XYto modifyZ";
deleteChars.apply( str, "XYZ" ); // –> "Text to modify"
Это решение учитывает, что результирующая строка - в отличие от
replace()
- никогда не становится больше, чем начальная строка при удалении символов. Таким образом, он избегает повторного выделения и копирования при добавлении символьно вStringBuilder
asreplace()
.Не говоря уже о бессмысленном поколении
Pattern
иMatcher
экземплярахreplace()
, которые никогда не нужны для удаления.В отличии от
replace()
этого решения можно удалить несколько символов одним махом.источник
str.replace("…", "")
создает экземпляры,private Pattern(…)
а затем генерирует вызовы шаблоновpublic String replaceAll(String repl)
. Таким образом, произошли следующие вызовы функций:return Pattern.compile(target.toString(), Pattern.LITERAL).matcher( this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
- см. Комментарий Sal_Vader_808. В целом примерно в 3 раза дольше , чем мой хип лямбда - решения. И здесь хорошо объясняется, почему мое решение для лямбда- тазобедренного сустава также быстрее: почему Java String :: replace () такая медленная?Оценка основных ответов с помощью теста производительности, который подтверждает опасения, что текущий выбранный ответ делает дорогостоящие операции регулярного выражения под капотом
На сегодняшний день предоставленные ответы представлены в 3 основных стилях (без учета ответа JavaScript;)):
С точки зрения размера кода, String.replace является наиболее кратким. Простая реализация Java немного меньше и чище (IMHO), чем лямбда (не поймите меня неправильно - я часто использую лямбды там, где они уместны)
Скорость выполнения была в порядке от самой быстрой до самой медленной: простая реализация Java, Lambda, а затем String.replace () (которая вызывает регулярное выражение).
Безусловно, самой быстрой реализацией была простая реализация Java, настроенная таким образом, чтобы она предварительно выделяла буфер StringBuilder для максимально возможной длины результата, а затем просто добавляла символы в буфер, которых нет в строке «символы для удаления». Это позволяет избежать любых перераспределений, которые могут произойти для строк длиной более 16 символов (распределение по умолчанию для StringBuilder), и позволяет избежать «снижения влево» при удалении символов из копии строки, которая возникает, является реализацией Lambda.
Приведенный ниже код запускает простой тест производительности, запускает каждую реализацию 1 000 000 раз и регистрирует истекшее время.
Точные результаты меняются с каждым прогоном, но порядок производительности никогда не меняется:
Реализация лямбды (как скопировано из ответа Каплана) может быть медленнее, потому что она выполняет «сдвиг влево на один» из всех символов справа от удаляемого символа. Это очевидно ухудшится для более длинных строк с большим количеством символов, требующих удаления. Также могут быть некоторые издержки в самой реализации Lambda.
Реализация String.replace использует регулярное выражение и выполняет регулярное выражение «компилировать» при каждом вызове. Оптимизация этого заключается в прямом использовании регулярных выражений и кэшировании скомпилированного шаблона, чтобы избежать затрат на его компиляцию каждый раз.
источник
fromString.replace("X", "").replace("Y", "").replace("Z", "");
потребуется. Теперь мы получаем правильное время: Начните с простого Время: 759 | Старт лямбды Время: 1092 | Запустить deleteCharsLambda () Время: 1420 | Начало замены исправлено Время: 4636Вам нужно будет поставить символы должны быть удалены в квадратных скобках во время замены. Пример кода будет следующим:
источник
Вы можете использовать,
str = str.replace("X", "");
как упоминалось ранее, и все будет в порядке. Для вашей информации''
не пустой (или действительный) символ, но'\0'
есть.Таким образом, вы могли бы использовать
str = str.replace('X', '\0');
вместо этого.источник