【问题标题】:C# Remove special charactersC#删除特殊字符
【发布时间】:2011-04-15 18:15:18
【问题描述】:

我想从字符串中删除所有特殊字符。允许的字符是 A-Z(大写或小写)、数字 (0-9)、下划线 (_)、空格 ()、百分号 (%) 或点号 (.)。

我试过这个:

        StringBuilder sb = new StringBuilder();
        foreach (char c in input)
        {
            if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') | c == '.' || c == '_' || c == ' ' || c == '%')
            { sb.Append(c); }
        }
        return sb.ToString();

还有这个:

        Regex r = new Regex("(?:[^a-z0-9% ]|(?<=['\"])s)", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant | RegexOptions.Compiled); 
        return r.Replace(input, String.Empty); 

但似乎没有任何效果。任何帮助将不胜感激。

谢谢!

【问题讨论】:

  • 你看过 StackOverflow 上的this 线程吗?这家伙有一个你似乎想要的有效实现。
  • 这是一种类型吗? "'z') | c == '.' ||”?
  • 非常感谢您的所有回复。他们都为我工作。我刚刚意识到我忘了重新发布,这导致了它也在消除空白的问题。
  • @Matt Dawdy:我认为这是一个错字——“类型”也是如此:p
  • @Aasmund Eldhuset -- 这太有趣了。至少我对此并不粗鲁! :)

标签: c# special-characters


【解决方案1】:
Regex.Replace(input, "[^a-zA-Z0-9% ._]", string.Empty)

【讨论】:

  • 这确实是最简单最合适的解决方案。
【解决方案2】:

您可以将第一种方法简化为

StringBuilder sb = new StringBuilder();
foreach (char c in input)
{
    if (Char.IsLetterOrDigit(c) || c == '.' || c == '_' || c == ' ' || c == '%')
    { sb.Append(c); }
}
return sb.ToString();

这似乎通过了简单的测试。您可以使用 LINQ 缩短它

return new string(
    input.Where(
        c => Char.IsLetterOrDigit(c) || 
            c == '.' || c == '_' || c == ' ' || c == '%')
    .ToArray());

【讨论】:

  • 小心Char.IsLetterOrDigit,因为它考虑了所有个Unicode字母和数字。所以Char.IsLetterOrDigit('Ѝ') 返回true,因为那是西里尔字母中的一个字母。
【解决方案3】:

第一种方法似乎是正确的,只是在c == '.' 之前有一个|(按位或)而不是||

顺便说一句,你应该说明什么不起作用(它不编译,或者它崩溃,或者它产生错误的输出?)

【讨论】:

    【解决方案4】:
    StringBuilder sb = new StringBuilder();
    foreach (char c in input)
    {
        if (char.IsLetterOrDigit(c) || "_ %.".Contains(c.ToString()))
            sb.Append(c);
    }
    return sb.ToString();
    

    【讨论】:

      【解决方案5】:

      这就是我的版本的外观。

      StringBuilder sb = new StringBuilder();
      foreach (char c in input)
      {
          if (Char.IsLetterOrDigit(c) ||
              c == '.' || c == '_' || c == ' ' || c == '%')
              sb.Append(c);
          }
      }
      return sb.ToString();
      

      【讨论】:

      • IsLetterOrDigit 允许 all Unicode 字母和数字。例如,使用 'Ѝ' 调用它会返回 true
      • @Jim:是的,我明白这一点。但是,虽然最初的问题只检查了英文字母字符,但它也没有解决国际字符的问题。 Char.IsLetterOrDigit() 似乎很有可能满足 OP 的要求。
      【解决方案6】:

      将每个 char 转换为 int,然后将其 ascii 代码与 ascii 表进行比较,您可以在 Internet 上找到该表:http://www.asciitable.com/

          {
              char[] input = txtInput.Text.ToCharArray();
              StringBuilder sbResult = new StringBuilder();
      
              foreach (char c in input)
              {
                  int asciiCode = (int)c;
                  if (
                      //Space
                      asciiCode == 32
                      ||
                      // Period (.)
                      asciiCode == 46
                      ||
                      // Percentage Sign (%)
                      asciiCode == 37
                      ||
                      // Underscore
                      asciiCode == 95
                      ||
                      ( //0-9, 
                          asciiCode >= 48
                          && asciiCode <= 57
                      )
                      ||
                      ( //A-Z
                          asciiCode >= 65
                          && asciiCode <= 90
                      )
                      ||
                      ( //a-z
                          asciiCode >= 97
                          && asciiCode <= 122
                      )
                  )
                  {
                      sbResult.Append(c);
                  }
              }
      
              txtResult.Text = sbResult.ToString();
          }
      

      【讨论】:

        【解决方案7】:
        private string RemoveReservedCharacters(string strValue)
        {
            char[] ReservedChars = {'/', ':','*','?','"', '<', '>', '|'};
        
            foreach (char strChar in ReservedChars)
            {
                strValue = strValue.Replace(strChar.ToString(), "");
            }
            return strValue;
        }
        

        【讨论】:

        • 可以接受的解决方案,因为它很简单。性能不是很好,因为它为每个替换的字符创建一个新字符串。为什么 ReservedChars 不是字符串 []?这样你就不需要每次都调用 ToString 了。
        猜你喜欢
        • 1970-01-01
        • 2019-11-09
        • 2014-05-14
        • 1970-01-01
        • 1970-01-01
        • 2014-05-20
        • 1970-01-01
        • 1970-01-01
        • 2014-05-04
        相关资源
        最近更新 更多