5

您好,我正在尝试从用户输入中删除特殊字符。

        public void fd()
        {
            string output = "";
            string input = Console.ReadLine();
            char[] charArray = input.ToCharArray();

            foreach (var item in charArray)
            {

                if (!Char.IsLetterOrDigit(item))
                {

                   \\\CODE HERE                    }

            }

            output = new string(trimmedChars);
            Console.WriteLine(output);
        }

最后,我将其转回字符串。我的代码只删除了字符串中的一个特殊字符。有没有人对更简单的方法有任何建议

4

3 回答 3

4

你有一个很好的实现,只需考虑使用下一个代码,它只是有点短,但有一点更高的抽象

var input =  " th@ere's! ";

Func<char, bool> isSpecialChar = ch => !char.IsLetter(ch) && !char.IsDigit(ch);

for (int i = 1; i < input.Length - 1; i++)
{
    //if current character is a special symbol
    if(isSpecialChar(input[i])) 
    {
        //if previous or next character are special symbols
        if(isSpecialChar(input[i-1]) || isSpecialChar(input[i+1]))
        {
            //remove that character
            input = input.Remove(i, 1);
            //decrease counter, since we removed one char
            i--;
        }
    }
}
Console.WriteLine(input); //prints " th@ere's "

每次调用时都会创建一个新字符串Remove。使用 aStringBuilder以获得更高的内存性能解决方案。

于 2013-11-13T04:57:11.787 回答
2

您的代码的问题在于,您从所做的每个更改中获取数据charArray并将结果放入其中trimmedChars,因此每次更改都会忽略所有先前的更改并使用原始更改。最后,您只有最后一次更改。

代码的另一个问题是您IndexOf用于获取字符的索引,但这将获取该字符第一次出现的索引,而不是您获得该字符的索引。例如,当您位于!字符串中的第二个时,"foo!bar!"您将获得第一个的索引。

您无需将字符串转换为数组即可处理字符串中的字符。您可以遍历字符串中字符的索引。

请注意,在查看前后字符时,还应检查索引的值,以免尝试查看字符串之外的字符。

public void fd() {
  string input = Console.ReadLine();
  int index = 0;
  while (index < input.Length) {
    if (!Char.IsLetterOrDigit(input, index) && ((index == 0 || !Char.IsLetterOrDigit(input, index - 1)) || (index == input.Length - 1 || !Char.IsLetterOrDigit(input, index + 1)))) {
      input = input.Remove(index, 1);
    } else {
      index++;
    }
  }
  Console.WriteLine(input);
}
于 2013-11-13T05:20:11.787 回答
0

自从我接触 C# 以来已经有一段时间了,但是 reg ex 可能会有所帮助

string input = string.Format("{0}! ", Console.ReadLine());
Regex rgx = new Regex("(?i:[^a-z]?)[.](?i:[^a-z]?)");
string output = rgx.Replace(input, "$1$2");

正则表达式查找左侧或右侧具有非字母字符的字符,并将其替换为空。

于 2013-11-13T04:59:29.683 回答