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

时间:2011-01-01 23:43:04

标签: java string character

我可以用这个:

String str = "TextX Xto modifyX";
str = str.replace('X','');//that does not work because there is no such character ''

有没有办法从Java中的String中删除所有出现的字符X

我试过这个并不是我想要的:str.replace('X',' '); //replace with space

13 个答案:

答案 0 :(得分:492)

尝试使用overload that takes CharSequence arguments(例如,String)而不是char

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

答案 1 :(得分:41)

使用

public String replaceAll(String regex, String replacement)

会奏效。

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

执行

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

返回:

lakjsdf xx

答案 2 :(得分:22)

如果您想使用Java字符串做一些事情,Commons Lang StringUtils是一个值得关注的好地方。

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

答案 3 :(得分:7)

String test = "09-09-2012";
String arr [] = test.split("-");
String ans = "";

for(String t : arr)
    ans+=t;

这是我从字符串中删除字符的示例。

答案 4 :(得分:4)

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

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

其中g表示全局,因此它将遍历整个字符串并将所有X替换为''; 如果你想要替换X和x,你只需说:

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

(请参阅我的小提琴:fiddle

答案 5 :(得分:2)

您好试试下面的代码

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

答案 6 :(得分:2)

使用replaceAll而不是替换

GetCapabilities

这应该给你想要的答案。

答案 7 :(得分:1)

这是一个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"

答案 8 :(得分:0)

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

答案 9 :(得分:0)

通过性能基准评估主要答案,这证实了人们对当前选择的答案使幕后正则表达式操作昂贵的担忧

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

  • 使用String.replace(charsToDelete,“”);在引擎盖下使用正则表达式
  • 使用Lambda
  • 使用简单的Java实现

就代码大小而言,显然String.replace是最简洁的。简单的Java实现比Lambda稍微更小,更干净(IMHO)(请不要误解-我经常在合适的地方使用Lambda)

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

到目前为止,最快的实现是对简单的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实现,使用正则表达式,并在每次调用时进行正则表达式“编译”。对此的一种优化是直接使用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));
    }
}

答案 10 :(得分:0)

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

String s = "$116.42".replaceAll("[$]", "");

答案 11 :(得分:0)

...另一个lambda
从原始副本中复制新字符串,但忽略要删除的字符

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

答案 12 :(得分:-3)

你可以使用前面提到的str = str.replace("X", "");,你会没事的。对于您的信息''不是空(或有效)字符,但'\0'是。

所以你可以改用str = str.replace('X', '\0');