替代 String.Replace

Posted

技术标签:

【中文标题】替代 String.Replace【英文标题】:Alternative to String.Replace 【发布时间】:2010-09-12 05:01:37 【问题描述】:

所以我今天写了一些代码,基本上是这样的:

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

这不是很好。我想知道是否有一个正则表达式或我可以编写的东西来替换对Replace() 函数的所有调用?

【问题讨论】:

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

您可以使用 Regex.Replace()。所有字符都可以放在方括号之间,这与方括号之间的任何字符匹配。一些特殊字符必须用反斜杠转义,我在这里使用@verbatim 字符串,所以我不必为 C# 编译器双重转义它们。第一个参数是输入字符串,最后一个参数是替换字符串。

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

【讨论】:

【参考方案2】:

仅供参考 - 如果您需要修改此正则表达式,您需要了解正则表达式语言。这很简单,作为开发人员,您确实应该将正则表达式添加到您的工具箱中 - 您不需要每天都需要它们,但是能够在需要时在必要时适当地应用它们会回报您十倍于最初的努力。这是一个网站链接,其中包含一些一流的、易于遵循的教程和有关正则表达式的参考资料:regular-expressions.info。一旦您对正则表达式有所了解并想在您的软件中使用它们,您就会想购买 Regex Buddy。它是学习和使用正则表达式的廉价而非凡的工具。我非常很少购买开发工具,但是这个值得每一分钱。在这里:Regex Buddy

【讨论】:

【参考方案3】:
s/[!@#$%^*_+=\]/ /

将是它的正则表达式...在 c# 中你应该能够使用

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

虽然我的 C# 生锈了..

【讨论】:

【参考方案4】:

如果您不想深入研究 Regex,这里有一些其他扩展方法的可能性。

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

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"

【讨论】:

【参考方案5】:

如果需要,也许您可​​以通过使用 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  "
        
    


【讨论】:

这种方法的问题是每个替换的字符都会生成很多中间字符串。这与正则表达式解决方案解决的原始问题相同。

以上是关于替代 String.Replace的主要内容,如果未能解决你的问题,请参考以下文章

替代拉链的替代方式

替代:替代评估

NCS8823替代方案|NCS8823芯片替代方案|CS5260替代NCS8823方案电路

Markdown 替代品 Asciidoc 介绍

Edge浏览器不再支持showmodaldialog?有何替代方案

C# 中怎么应用JSON来替代之前的webservice??