如何在C#.NET中用空字符替换字符串中的一个字符

120

我有一个字符串:

string val = "123-12-1234";

如何在C#中使用空字符串来替换破折号。

我的意思是val.Replace(char oldChar, newChar);

oldCharnewChar中应该填什么。


18
为什么会有踩(downvote)?这是一个简单的问题,但这并不意味着它是错的,对吗?新用户可能很快就会感到沮丧。 - Peter Kelly
8
同意彼得·凯利的观点--点赞。 - Nick
3
可能是重复的问题:如何用空字符串替换“-”的出现? - cobbal
5
有人可以解释一下为什么这个被关闭了,理由是“过于局部”吗? - Xeo
重复,是的,踩,不,过于局限,不。 - Puppy
是的,“过于局限”是错误的。但我不会投票重新开放;如果它设法重新开放,我会保留我的投票将其关闭为重复项。没有个人恩怨。 :) - cHao
10个回答

171

你可以使用一个不同的 Replace() 重载方法,该方法接受字符串作为参数。

val = val.Replace("-", string.Empty)

4
感谢您提到替代方法是一种“重载”,+1。 - Nick
尝试使用上述重载替换\0字符,但它不起作用!\0字符将不会被替换。这在使用从Snmp设备接收的字符串数据时尤为明显。 - Steve Johnson
1
为什么 char 到 char 的替换重载在这里不起作用 - 为什么没有像 String.Empty 一样的 Char.Empty? - RBT
我在上面的“-”处使用了一个变量,并在其位置使用了charToReplace.ToString()。 - Zonus
当使用“Replace”时,请记住,“oldValue”的类型必须与“newValue”相同。例如,Replace(';',string.Empty.ToCharArray()[0])Replace(";", "")也可以使用。 - Adam Cox

70

虽然其他回答是正确的,但它们并没有明确解决您最初的疑问,我来解释一下。

如果您调用string.Replace(char oldChar, char newChar),它将用另一个字符替换字符的出现。这是一种一对一的替换方法。因此,结果字符串的长度将保持不变。

您想要的是删除破折号,显然这与用另一个字符替换它们不同。您不能用“没有字符”来替换它,因为1个字符始终是1个字符。这就是为什么您需要使用接受字符串的重载方法:字符串可以具有不同的长度。如果您用长度为0的字符串替换长度为1的字符串,则效果是破折号消失了,被“nothing”替换了。


4
感谢您提供详细的解释。 - SaiBand
1
毕竟你没有演示。 :P 哦好吧。无论如何,还是因为解释加1。 - cHao
1
你可以在这里找到更多信息:链接 - Dinei

7

6
这似乎太简单了,但是:
val.Replace("-","");

4
string val = "123-12-1234";

val = val.Replace("-", ""); // result: 123121234

4

如果你想用空字符替换字符串中的一个字符,意味着你想从字符串中删除该字符,请阅读R. Martinho Fernandes的答案。

这里是如何从字符串中删除一个字符(用“空字符”替换)的示例:

    public static string RemoveCharFromString(string input, char charItem)
    {
        int indexOfChar = input.IndexOf(charItem);
        if (indexOfChar >= 0)
        {
            input = input.Remove(indexOfChar, 1);
        }
        return input;
    }

或者使用这个版本从字符串中删除所有重复的字符:

    public static string RemoveCharFromString(string input, char charItem)
    {
        int indexOfChar = input.IndexOf(charItem);
        if (indexOfChar < 0)
        {
            return input;
        }
        return RemoveCharFromString(input.Remove(indexOfChar, 1), charItem);
    }

2

我一直觉得没有办法“从字符串中删除字符”,只能“从字符串中删除字符串”。

我采用了Alexei Bondarev答案的修改版本,并对其进行了基准测试,与标准的string.Replace(string, "")进行了比较。

|               Method |     Mean |     Error |   StdDev |  Gen 0 | Allocated |
|--------------------- |---------:|----------:|---------:|-------:|----------:|
|        StringReplace | 57.28 ns | 14.701 ns | 0.806 ns | 0.0063 |      40 B |
| RemoveCharFromString | 51.62 ns |  4.604 ns | 0.252 ns | 0.0216 |     136 B |

如您所见,这些结果几乎相同,但是“RemoveCharFromString”分配了3倍的内存。

结论是 - 坚持使用 String.Replace(string, "")

供参考,这是我使用的方法:

public static string RemoveCharFromString(string input, char charItem)
{
    int indexOfChar = input.IndexOf(charItem);
    while (indexOfChar >= 0)
    {
        input = input.Remove(indexOfChar, 1);
        indexOfChar = input.IndexOf(charItem, indexOfChar);
    }
    return input;
}

1
如果你正在循环中,比如你正在循环一个你想要移除的标点符号列表,你可以这样做:
      private const string PunctuationChars = ".,!?$";
          foreach (var word in words)
                {
                    var word_modified = word;

                    var modified = false;

                    foreach (var punctuationChar in PunctuationChars)
                    {
                        if (word.IndexOf(punctuationChar) > 0)
                        {
                            modified = true;
                            word_modified = word_modified.Replace("" + punctuationChar, "");


                        }
                    }
               //////////MORE CODE
               }

“诀窍如下:”
word_modified.Replace("" + punctuationChar, "");

1

我有 Razvan Dumitru 的代码的拉丁版,因为我们使用了百万指数。当然,我使用了双重替换 :D

public static string CleanNumb(string numb) 
{
    foreach (char c in ".,'´")
       numb = numb.Replace(c, ' ');

    return numb.Replace(" ", "");
}

1

我一直感到困扰的是,我不能使用String.Remove方法来删除字符串中的某些字符或字符串实例,因此我通常会将这些扩展方法添加到我的代码库中:

public static class StringExtensions
{
    public static string Remove(this string str, string toBeRemoved)
    {
        return str.Replace(toBeRemoved, "");
    }

    public static string RemoveChar(this string str, char toBeRemoved)
    {
        return str.Replace(toBeRemoved.ToString(), "");

    }
}

由于 char 类型只能解析为 string.Remove(int startIndex),所以无法使用重载语义。"很遗憾"

当然,这纯粹是美学上的考虑,但我喜欢它……


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接