如何从字符串中删除多个不良字符?

6
这是我的工作代码:
string Input;
string Output;

Input = data;
Output = Input.Replace(@")", "");

这里,我只是从字符串中移除右括号“)”,如果存在的话。现在,我如何扩展违规字符列表,例如包括左括号“(”和破折号“-”?

我知道我可以编写另外两个类似于Output的语句,但我想知道是否有更好的方法...


2
同样的问题:https://dev59.com/sms05IYBdhLWcg3wJ-uQ - Rudis
8个回答

13

如果你只需要替换几个字符串(我看到你只需要替换三个),不必担心正则表达式或字符串构建器,最简单的方法是将三个 Replace 调用链接成一个语句:

Output = Input.Replace("(", "").Replace(")", "").Replace("-", "");

...这比每次将结果存储在输出中略好一些。


1
我喜欢这个,因为我不必使用Regex或LINQ或数组/集合。 - MrPatterns

12
Output = Regex.Replace(Input, "[()-]", "");

[] 在表达式中创建一个字符类。它不直接匹配这些字符。


8

LINQ解决方案:

Output = new String(Input.Except("()-").ToArray());

12
"Except" 返回一个不同的字符集,因此输出结果是不正确的(例如 "Test" 将变成 "Tes"),您可以在 MSDN 上查找相关信息。 - Ronald
2
@Ronald:你说得对,重复的元素会被删除...但这种行为并没有被记录在文档中。我不得不查看ExceptIterator的实现。 - Ben Voigt
2
@BenVoigt 您对我的示例是正确的,大小写确实很重要,因此:test将变为tes。MSDN文档确实不清楚,只有.NET Framework 4的社区添加(注释)显示了这一点(在撰写本文时)。 - Ronald
1
这似乎不起作用,例如使用“[]”作为except参数的[dbo].[Temp_CSVLoad]会产生dbo.Temp_CSVLa。 - Neil Walker
它实际上已经有文档记录了:两个集合的差集被定义为第一个集合中不出现在第二个集合中的成员。(https://learn.microsoft.com/en-us/dotnet/api/system.linq.enumerable.except) - Stephan
显示剩余6条评论

4

作为正则表达式Regex的替代方案,将其作为一组替换项进行管理,并使用StringBuilder执行替换可能更容易。

var replacements = new[] { ")", "-" };
var output = new StringBuilder(Input);
foreach (var r in replacements)
    output.Replace(r, string.Empty);

1
请注意,var replacements =“()-”;也可以正常工作——字符串也是集合。 - Ben Voigt

3
你可以使用Regex.Replace()函数,文档可以在这里找到。

1
这将使您也能够做同样的事情。
    private static string ReplaceBadWords(string[] BadStrings, string input)
    {
        StringBuilder sb = new StringBuilder(input);
        BadStrings.ToList().ForEach(b => 
        {
            if(b != "") 
            {
                sb = sb.Replace(b, string.Empty);
            }
        });

        return sb.ToString();
    }

样例用法如下:
        string[] BadStrings = new string[]
        {
            ")",
            "(",
            "random",
            ""
        };

        string input = "Some random text()";
        string output = ReplaceBadWords(BadStrings, input);

1
你可以使用包含不良词汇的列表。现在只需使用foreach循环遍历它,并替换每个不良字符串。
StringBuilder output = new StringBuilder("(Hello) W,o.r;ld");
List<string> badwords = new List<string>();
badwords.Add("(");
badwords.Add(")");
badwords.Add(",");
badwords.Add(".");
badwords.Add(";");
badwords.ForEach(bad => output = output.Replace(bad, String.Empty));
//Result "Hello World"

敬祝好运。

//编辑: 根据 Khan 建议实施了更改。


1
你应该将 source 改为 StringBuilder,否则每个 badword 都会在内存中创建一个新的字符串。 - Khan
好的,谢谢。我已经实施了这些更改。 - Marco

-1

我可能会使用正则表达式,因为它简洁明了。如果你害怕正则表达式,你可以教计算机为你编写它们。这里有一个简单的类用于清理字符串:你只需要提供一个无效字符列表:

class StringCleaner
{
  private Regex regex ;

  public StringCleaner( string invalidChars ) : this ( (IEnumerable<char>) invalidChars )
  {
    return ;
  }
  public StringCleaner ( params char[] invalidChars ) : this( (IEnumerable<char>) invalidChars )
  {
    return ;
  }
  public StringCleaner( IEnumerable<char> invalidChars )
  {
    const string    HEX     = "0123456789ABCDEF" ;
    SortedSet<char> charSet = new SortedSet<char>( invalidChars ) ;
    StringBuilder   sb      = new StringBuilder( 2 + 6*charset.Count ) ;

    sb.Append('[') ;
    foreach ( ushort c in charSet )
    {
      sb.Append(@"\u" )
        .Append( HEX[ ( c >> 12 ) & 0x000F ] )
        .Append( HEX[ ( c >>  8 ) & 0x000F ] )
        .Append( HEX[ ( c >>  4 ) & 0x000F ] )
        .Append( HEX[ ( c >>  0 ) & 0x000F ] )
        ;
    }
    sb.Append(']') ;
    this.regex = new Regex( sb.ToString() ) ;
  }

  public string Clean( string s )
  {
    if ( string.IsNullOrEmpty(s) ) return s ;
    string value = this.regex.Replace(s,"") ;
    return value ;
  }

}

一旦你掌握了这个,就很容易:

static void Main(string[] args)
{
  StringCleaner cleaner = new StringCleaner( "aeiou" ) ;
  string dirty = "The quick brown fox jumped over the lazy dog." ;
  string clean = cleaner.Clean(dirty) ;
  Console.WriteLine( clean ) ;
  return;
}

最后,cleanTh qck brwn fx jmpd vr th lzy dg.

很容易!


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