替换字符串的另一种方法

18

今天我在写一些代码,大致像这样:

string returnString = s.Replace("!", " ")
            .Replace("@", " ")
            .Replace("#", " ")
            .Replace("$", " ")
            .Replace("%", " ")
            .Replace("^", " ")
            .Replace("*", " ")
            .Replace("_", " ")
            .Replace("+", " ")
            .Replace("=", " ")
            .Replace("\", " ")

这并不是很好。我在想是否有一个正则表达式或其他什么东西,可以替换所有对 Replace() 函数的调用?


@lomaxx:看看dimitre的解决方案,它完全避免使用正则表达式。 - Dimitre Novatchev
@Cawas:在这里:http://dnovatchev.spaces.live.com/blog/cns!44B0A32C2CCF7488!353.entry查看XPath translate()函数的描述,请访问此处:http://www.w3.org/TR/xpath-functions/#func-translate - Dimitre Novatchev
@dimitre 很酷,XPath很好用。但是我怎么能仅从你的评论中找到它呢? - cregox
@Cawas:我在2008年12月发布回答后立即将其删除了(很快就得到了两个反对票)。不幸的是,对于许多对c#感兴趣的人来说,甚至提到XSLT都是令人反感的:(。这样的人失去了理性/批判性思维的能力。 - Dimitre Novatchev
5个回答

32
你可以使用 Regex.Replace()。所有字符都可以放在方括号中,匹配方括号内的任何字符。一些特殊字符必须使用反斜杠进行转义,并且我在这里使用了 @verbatim 字符串,因此不必为 C# 编译器双重转义它们。第一个参数是输入字符串,最后一个参数是替换字符串。
var returnString = Regex.Replace(s,@"[!@#\$%\^*_\+=\\]"," ");

2
FYI - 如果您需要修改这个正则表达式,您需要对正则表达式语言有一定的了解。它非常简单,作为开发人员,您真的应该在您的工具箱中添加正则表达式 - 您不需要每天都用它们,但是当需要时能够适当地应用它们将为您带来十倍的回报。这里提供一个链接,其中包含一些顶尖的、易于跟随的正则表达式教程和参考资料: regular-expressions.info。一旦您掌握了正则表达式的感觉并想在您的软件中使用它们,您会想要购买Regex Buddy。它是一个非常便宜且特别适合学习和使用正则表达式的工具。我非常很少购买开发工具,但这个确实物超所值。它在这里:Regex Buddy

0
s/[!@#$%^*_+=\]/ /

这是它的正则表达式... 在 C# 中,您应该能够使用

Regex.Replace(yourstring, "[!@#$%^*_+=\]", "" ); 

虽然我的C#有点生疏了...


0

如果您不想深入了解正则表达式,这里有几个其他的扩展方法可供选择。

您可以传递要替换的特定字符:

static public string ReplaceCharsWithSpace(this string original, string chars)
{
    var result = new StringBuilder();
    foreach (var ch in original)
    {
        result.Append(chars.Contains(ch) ? ' ' : ch);
    }
    return result.ToString();
}

或者,如果您知道您只想保留或仅剥离特定类型的字符,则可以使用 char 中的各种方法,例如 IsLetterIsDigitIsPunctuationIsSymbol

static public string ReplaceNonLetterCharsWithSpace(this string original)
{
    var result = new StringBuilder();
    foreach (var ch in original)
    {
        result.Append(char.IsLetter(ch) ? ch : ' ');
    }
    return result.ToString();
}

以下是如何使用这些可能性的方法:

string s = "ab!2c";
s = s.ReplaceCharsWithSpace(@"!@#$%^*_+=/");  // s contains "ab  c"

string t = "ab3*c";
t = t.ReplaceNonLetterCharsWithSpace();  // t contains "ab  c"

0
也许你可以使用 Lambda 表达式和 List<>, ForEach 来将其简化为几行代码。
using System.Collections.Generic;

namespace ReplaceWithSpace 
 {
    class Program 
    {
        static void Main(string[] args) 
        {
            string someString = "#1, 1+1=2 $string$!";

            var charsToRemove = new List<char>(@"!@#$%^*_+=\");
            charsToRemove.ForEach(c => someString = someString.Replace(c, ' '));

            System.Diagnostics.Debug.Print(someString); //" 1, 1 1 2  string  "
        }
    }

}

这种方法的问题在于每个替换字符都会生成大量中间字符串。这与原始问题具有相同的问题,正则表达式解决了这个问题。 - Duncan

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