特殊字符正则表达式

时间:2013-11-13 04:51:23

标签: c# special-characters trim

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

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

最后我把它变回了一根绳子。我的代码只删除字符串中的一个特殊字符。有没有人以更简单的方式提出任何建议

3 个答案:

答案 0 :(得分: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时都会创建一个新字符串。使用StringBuilder获得更高内存性能的解决方案。

答案 1 :(得分: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);
}

答案 2 :(得分: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");

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