【问题标题】:Removing all non letter characters from a string in C#从 C# 中的字符串中删除所有非字母字符
【发布时间】:2015-02-26 05:35:10
【问题描述】:

我想从字符串中删除所有非字母字符。当我说所有字母时,我指的是不在字母表中的任何字母或撇号。这是我的代码。

public static string RemoveBadChars(string word)
{
    char[] chars = new char[word.Length];
    for (int i = 0; i < word.Length; i++)
    {
        char c = word[i];

        if ((int)c >= 65 && (int)c <= 90)
        {
            chars[i] = c;
        }
        else if ((int)c >= 97 && (int)c <= 122)
        {
            chars[i] = c;
        }
        else if ((int)c == 44)
        {
            chars[i] = c;
        }
    }

    word = new string(chars);

    return word;
}

它很接近,但不太有效。问题是这样的:

[in]: "(the"
[out]: " the"

它给了我一个空格而不是“(”。我想完全删除这个字符。

【问题讨论】:

  • 您有空格(空字符),因为 chars[] 中的元素如果是坏字符则为零。我认为你需要根据你有多少坏字符来缩小字符串

标签: c#


【解决方案1】:

Char 类有一个可以提供帮助的方法。使用Char.IsLetter() 检测有效字母(并额外检查撇号),然后将结果传递给string 构造函数:

var input = "(the;':";

var result = new string(input.Where(c => Char.IsLetter(c) || c == '\'').ToArray());

输出:

'

【讨论】:

    【解决方案2】:

    您应该改用Regular Expression (Regex)

    public static string RemoveBadChars(string word)
    {
        Regex reg = new Regex("[^a-zA-Z']");
        return reg.Replace(word, string.Empty);
    }
    

    如果不想替换空格:

    Regex reg = new Regex("[^a-zA-Z' ]");
    

    【讨论】:

    • 我以前见过这个,但老实说,我不知道它是如何工作的,这就是我避免它的原因。 “[^a-zA-Z]”是什么意思?对我来说,这看起来像是毫无意义的数字,但意义重大,我无法弄清楚。
    • 撇号怎么样?
    • 如果您点击我回答中的链接,您可以看到所有正则表达式运算符的解释。 @V-SHY Opps,没有仔细阅读他的问题,改变了我的答案。
    【解决方案3】:

    正则表达式会更好,因为这效率很低,但要回答您的问题,您的代码的问题是您应该在 for 循环中使用除 i 之外的其他变量。所以,是这样的:

    public static string RemoveBadChars(string word)
    {
        char[] chars = new char[word.Length];
        int myindex=0;
        for (int i = 0; i < word.Length; i++)
        {
            char c = word[i];
    
            if ((int)c >= 65 && (int)c <= 90)
            {
                chars[myindex] = c;
                myindex++;
            }
            else if ((int)c >= 97 && (int)c <= 122)
            {
                chars[myindex] = c;
                myindex++;
            }
            else if ((int)c == 44)
            {
                chars[myindex] = c;
                myindex++;
            }
        }
    
        word = new string(chars);
    
        return word;
    }
    

    【讨论】:

    • 谢谢,我知道我可以使用正则表达式,但我试图在没有它的情况下这样做,而且我根本不懂正则表达式。
    • 当有要删除的字符时,该函数最后保留null。我认为你应该这样做: word = new string(chars, 0, myindex);
    【解决方案4】:
    private static Regex badChars = new Regex("[^A-Za-z']");
    
    public static string RemoveBadChars(string word)
    {
        return badChars.Replace(word, "");
    }
    

    这将创建一个由 字符类(括在方括号中)组成的正则表达式,用于查找 任何不是的内容(字符内的前导 ^类)AZ、az 或 '.然后它定义了一个函数,用空字符串替换与表达式匹配的任何内容。

    【讨论】:

      【解决方案5】:

      这是有效的答案,他说他想删除非字母字符

      public static string RemoveNoneLetterChars(string word)
      {
          Regex reg = new Regex(@"\W");
          return reg.Replace(word, " "); // or return reg.Replace(word, String.Empty); 
      }
      

      【讨论】:

        【解决方案6】:
        word.Aggregate(new StringBuilder(word.Length), (acc, c) => acc.Append(Char.IsLetter(c) ? c.ToString() : "")).ToString();
        

        或者你可以用任何函数代替 IsLetter。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-04-26
          • 1970-01-01
          • 2013-04-30
          • 2022-01-09
          • 1970-01-01
          • 2018-12-02
          • 2013-01-19
          • 2015-11-14
          相关资源
          最近更新 更多