Answers:
尝试使用需要CharSequence
参数(例如String
)而不是的重载char
:
str = str.replace("X", "");
CharSequence
。docs.oracle.com/javase/7/docs/api/java/lang/...
X
是char类型,该怎么办?
toString
首先需要这样做。因此您的代码应类似于str = str.replace(yourChar.toString(), "");
str = str.replace("\uffff", "");
使用
public String replaceAll(String regex, String replacement)
将工作。
用法是str.replace("X", "");
。
执行中
"Xlakjsdf Xxx".replaceAll("X", "");
返回:
lakjsdf xx
replace
一个简单的重载CharSequence
。
如果您想使用Java字符串做某事,Commons Lang StringUtils是一个不错的选择。
StringUtils.remove("TextX Xto modifyX", 'X');
replace
。
String test = "09-09-2012";
String arr [] = test.split("-");
String ans = "";
for(String t : arr)
ans+=t;
这是我从字符串中删除字符的示例。
您好,请在下面尝试此代码
public class RemoveCharacter {
public static void main(String[] args){
String str = "MXy nameX iXs farXazX";
char x = 'X';
System.out.println(removeChr(str,x));
}
public static String removeChr(String str, char x){
StringBuilder strBuilder = new StringBuilder();
char[] rmString = str.toCharArray();
for(int i=0; i<rmString.length; i++){
if(rmString[i] == x){
} else {
strBuilder.append(rmString[i]);
}
}
return strBuilder.toString();
}
}
使用replaceAll代替replace
str = str.replaceAll("X,"");
这应该给您想要的答案。
return Pattern.compile(target.toString(), Pattern.LITERAL).matcher( this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
package com.acn.demo.action;
public class RemoveCharFromString {
static String input = "";
public static void main(String[] args) {
input = "abadbbeb34erterb";
char token = 'b';
removeChar(token);
}
private static void removeChar(char token) {
// TODO Auto-generated method stub
System.out.println(input);
for (int i=0;i<input.length();i++) {
if (input.charAt(i) == token) {
input = input.replace(input.charAt(i), ' ');
System.out.println("MATCH FOUND");
}
input = input.replaceAll(" ", "");
System.out.println(input);
}
}
}
input = "deletes all blanks too";
给“ deletesalllankstoo”
这是一个lambda函数,它删除所有作为字符串传递的字符
BiFunction<String,String,String> deleteChars = (fromString, chars) -> {
StringBuilder buf = new StringBuilder( fromString );
IntStream.range( 0, buf.length() ).forEach( i -> {
while( i < buf.length() && chars.indexOf( buf.charAt( i ) ) >= 0 )
buf.deleteCharAt( i );
} );
return( buf.toString() );
};
String str = "TextX XYto modifyZ";
deleteChars.apply( str, "XYZ" ); // –> "Text to modify"
该解决方案考虑到了,与之不同的是replace()
,删除字符串时所得的String 永远不会变得大于起始String。因此,它避免了重复分配和追加的同时字符的明智复制StringBuilder
的replace()
一样。
更不用说不需要删除的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注释。总而言之,比我的髋部 lambda解决方案长3倍。这里很好地解释了为什么我的臀部 lambda解决方案也更快:为什么Java的String :: replace()这么慢?
通过性能基准评估主要答案,这证实了人们对当前选择的答案会使引擎盖下正则表达式操作昂贵的担忧
到目前为止,提供的答案有3种主要样式(忽略JavaScript答案;)):
就代码大小而言,显然String.replace是最简洁的。简单的Java实现比Lambda稍微更小,更干净(IMHO)(请不要误解-我经常在合适的地方使用Lambda)
执行速度从快到慢依次为:简单的Java实现,Lambda,然后是String.replace()(调用regex)。
到目前为止,最快的实现是对简单的Java实现进行了调整,以便它可以将StringBuilder缓冲区预分配为最大可能的结果长度,然后仅将不在“要删除的字符”字符串中的字符追加到缓冲区中。这样可以避免在长度大于16个字符的字符串中发生任何重新分配(StringBuilder的默认分配),并且避免了从Lambda实现中删除字符串副本中的字符而导致的“向左滑动”性能问题。
下面的代码运行一个简单的基准测试,每个实现运行1,000,000次,并记录经过的时间。
每次运行的确切结果会有所不同,但性能的顺序永远不会改变:
Start simple Java implementation
Time: 157 ms
Start Lambda implementation
Time: 253 ms
Start String.replace implementation
Time: 634 ms
Lambda实现(从Kaplan的答案复制而来)可能会更慢,因为它会执行所有字符“左移一位”,将其移到要删除字符的右边。对于较长的带有很多字符需要删除的字符串,这显然会变得更糟。此外,Lambda实现本身可能会有一些开销。
String.replace实现,使用正则表达式,并在每次调用时进行正则表达式“编译”。对此的一种优化将是直接使用正则表达式并缓存已编译的模式,以避免每次编译它的开销。
package com.sample;
import java.util.function.BiFunction;
import java.util.stream.IntStream;
public class Main {
static public String deleteCharsSimple(String fromString, String charsToDelete)
{
StringBuilder buf = new StringBuilder(fromString.length()); // Preallocate to max possible result length
for(int i = 0; i < fromString.length(); i++)
if (charsToDelete.indexOf(fromString.charAt(i)) < 0)
buf.append(fromString.charAt(i)); // char not in chars to delete so add it
return buf.toString();
}
static public String deleteCharsLambda(String fromString1, String charsToDelete)
{
BiFunction<String, String, String> deleteChars = (fromString, chars) -> {
StringBuilder buf = new StringBuilder(fromString);
IntStream.range(0, buf.length()).forEach(i -> {
while (i < buf.length() && chars.indexOf(buf.charAt(i)) >= 0)
buf.deleteCharAt(i);
});
return (buf.toString());
};
return deleteChars.apply(fromString1, charsToDelete);
}
static public String deleteCharsReplace(String fromString, String charsToDelete)
{
return fromString.replace(charsToDelete, "");
}
public static void main(String[] args)
{
String str = "XXXTextX XXto modifyX";
String charsToDelete = "X"; // Should only be one char as per OP's requirement
long start, end;
System.out.println("Start simple");
start = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++)
deleteCharsSimple(str, charsToDelete);
end = System.currentTimeMillis();
System.out.println("Time: " + (end - start));
System.out.println("Start lambda");
start = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++)
deleteCharsLambda(str, charsToDelete);
end = System.currentTimeMillis();
System.out.println("Time: " + (end - start));
System.out.println("Start replace");
start = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++)
deleteCharsReplace(str, charsToDelete);
end = System.currentTimeMillis();
System.out.println("Time: " + (end - start));
}
}
fromString.replace("X", "").replace("Y", "").replace("Z", "");
。现在我们得到了正确的时间:简单开始时间:759 | 启动Lambda时间:1092 | 开始deleteCharsLambda()时间:1420 | 开始替换已更正的时间:4636
在替换时,您需要将需要删除的字符放在方括号内。示例代码如下:
String s = "$116.42".replaceAll("[$]", "");