从字符串中移除所有出现的char

我可以用这个:

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

824100 次浏览

使用

public String replaceAll(String regex, String replacement)

将工作。

用法是str.replace("X", "");

执行

"Xlakjsdf Xxx".replaceAll("X", "");

返回:

lakjsdf xx

尝试使用重载,它接受CharSequence参数(例如,String)而不是char:

str = str.replace("X", "");

如果你想用Java字符串做一些事情,Commons Lang StringUtils是一个很好的地方。

StringUtils.remove("TextX Xto modifyX", 'X');

你可以像前面提到的那样使用str = str.replace("X", "");,这样就没问题了。根据你的信息,''不是空字符(或有效字符),但'\0'是。

所以你可以使用str = str.replace('X', '\0');代替。

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();
}
}

我喜欢在这种情况下使用RegEx:

str = str.replace(/X/g, '');

,其中g表示全局,因此它将遍历整个字符串并将所有X替换为"; 如果你想同时替换X和X,你只需输入:

str = str.replace(/X|x/g, '');

(看我的小提琴在这里:小提琴)

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);
}
}
}

使用replaceAll代替replace

str = str.replaceAll("X,"");

这应该会给你想要的答案。

这里是一个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() );
};
< p > String str = "TextX XYto modifyZ";
deleteChars.apply( str, "XYZ" ); // –> "Text to modify" < / p > 此解决方案考虑到结果字符串-与replace()不同-在删除字符时永远不会比起始字符串大。因此,它避免了像replace()那样在向StringBuilder追加字符时重复分配和复制。
更不用说在replace()中毫无意义的生成PatternMatcher实例,它们永远不需要被删除。
replace()不同的是,这个解决方案可以一次性删除几个字符

用性能基准评估主要答案,确认当前选择的答案在幕后进行昂贵的正则表达式操作

到目前为止,提供的答案有3种主要风格(忽略JavaScript的答案;)):

  • 使用字符串。替换(charsToDelete”、“);哪个在引擎盖下使用正则表达式
  • 使用λ
  • 使用简单的Java实现

在代码大小方面,显然是字符串。替换是最简洁的。简单的Java实现比Lambda更小更干净(恕我直言)(不要误解我的意思-我经常在合适的地方使用Lambdas)

执行速度从快到慢依次是:简单的Java实现,Lambda,然后是String.replace()(调用regex)。

到目前为止,最快的实现是经过优化的简单Java实现,它将StringBuilder缓冲区预先分配到最大可能的结果长度,然后简单地向缓冲区添加不在“chars to delete”字符串中的字符。这避免了字符串>长度为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实现本身可能会有一些开销。

的字符串。替换实现,使用regex并在每次调用时执行regex“编译”。对此的一种优化方法是直接使用regex并缓存已编译的模式,以避免每次编译的成本。

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));
}
}

在替换期间,您需要将需要删除的字符放在方括号内。示例代码如下所示:

String s = "$116.42".replaceAll("[$]", "");
< p > …另一个λ
从原字符串中复制一个新字符串,但省略要删除的字符

String text = "removing a special character from a string";


int delete = 'e';
int[] arr = text.codePoints().filter( c -> c != delete ).toArray();


String rslt = new String( arr, 0, arr.length );

给:rmoving a spcial charactr from a string