【问题标题】:How do I remove multiple offending characters from my string? [duplicate]如何从我的字符串中删除多个违规字符? [复制]
【发布时间】:2013-10-17 07:33:48
【问题描述】:

这是我的工作代码:

string Input;
string Output;

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

在这里,我只是从我的字符串中删除括号“)”,如果它存在的话。现在如何扩展“)”等违规字符列表以包括“(”和“-”?

我意识到我可以再写 2 条类似输出的语句,但我想知道是否有更好的方法...

【问题讨论】:

标签: c# string


【解决方案1】:

如果你只是做几个替换(我看到你只做三个),不用担心 Regex 或 StringBuilders 的最简单方法是将三个 Replace 调用链接到一个语句中:

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

...这比每次都将结果存储在输出中要好一点。

【讨论】:

  • 我喜欢这个,因为我不必使用 Regex 或 LINQ 或数组/集合。
【解决方案2】:

LINQ 解决方案:

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

【讨论】:

  • Except 返回一组不同的字符,因此输出不正确(例如,Test 将变为 Tes),您可以在 MSDN 上查找。
  • @Ronald:您的基本主张需要进行测试,但您声称的细节都是错误的。 "Test" 没有重复元素。并且链接的 MSDN 页面在任何地方都没有说 input1 中的元素如果已经被输出则被省略。
  • @Ronald:你说得对,重复将被删除......但是,这种行为没有记录在案。我不得不看看ExceptIterator的实现。
  • @BenVoigt 你对我的例子是正确的,字母大小写确实很重要,所以:test 将变为tes。 MSDN 文档确实不清楚,只有 .NET Framework 4 的社区添加 (cmets) 显示了这一点(在撰写本文时)。
  • 这似乎不起作用,例如[dbo].[Temp_CSVLoad] 使用“[]”作为 except 参数产生 dbo.Temp_CSVLa
【解决方案3】:
Output = Regex.Replace(Input, "[()-]", "");

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

【讨论】:

    【解决方案4】:

    作为Regex 的替代方案,将其作为替换集合进行管理并使用StringBuilder 进行替换可能更容易。

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

    【讨论】:

    • 请注意,var replacements = "()-"; 可以正常工作——字符串也是集合。
    【解决方案5】:

    您可以使用Regex.Replace(),记录在案的here

    【讨论】:

      【解决方案6】:

      您可以使用包含您的坏词的列表。现在只需使用 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 建议的更改。

      【讨论】:

      • 您应该将 source 更改为 StringBuilder,否则您将在内存中为每个 badword 创建一个新字符串。
      • 好点,谢谢。我已经实施了这些更改。
      【解决方案7】:

      这也可以让你做同样的事情

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

      【讨论】:

        【解决方案8】:

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

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

        其中clean的末尾是Th qck brwn fx jmpd vr th lzy dg.

        简单!

        【讨论】:

          猜你喜欢
          • 2013-05-13
          • 2014-01-26
          • 2014-06-26
          • 1970-01-01
          • 1970-01-01
          • 2021-04-17
          • 2013-07-01
          • 2019-04-19
          • 2015-09-06
          相关资源
          最近更新 更多