如何确定字符串是否包含任何特殊字符?

24

我想要查找一个字符串是否包含任何特殊字符,例如!、@、#、$、%、^、&、*、(、)等。

如何在不循环遍历字符串中的所有字符的情况下完成这个操作?

11个回答

39

使用String.IndexOfAny方法:

private static readonly char[] SpecialChars = "!@#$%^&*()".ToCharArray();

...

int indexOf = text.IndexOfAny(SpecialChars);
if (indexOf == -1)
{
    // No special chars
}
当然,这将在内部循环 - 但至少你不必在你的代码中这样做。

嘿,Jon,你会如何实现Mark的想法? - Manish
@Manish:考虑到您可能需要列出各种字符,正则表达式可能是最好的选择。 - Jon Skeet

13

与其检查字符串是否包含“特殊字符”,不如检查字符串中的所有字符是否是“普通”字符,换句话说,使用白名单而不是黑名单。原因是有很多字符可能被认为是“特殊字符”,如果尝试列出所有这些字符,则必定会漏掉某个。

因此,与其按照您所要求的方式进行操作,还不如检查例如您的字符串是否与正则表达式@"^\w+$"相匹配,或者您需要其他的匹配方式。


3
@Bubblewrap:我建议使用白名单正则表达式。这不是对问题的有效答案吗?黑名单方法的问题在于他写的“等等...”。电脑无法猜测你的意思,而列出所有特殊字符的清单在我看来是解决这个问题的错误方式。 - Mark Byers
在我看来并不是这样。如果不了解问题背后的动机,你就不能说使用白名单比使用IndexOfAny更好(甚至有效)。而且,正如我所读到的那样,这个问题特别涉及黑名单。 - Bubblewrap
1
+1...很好的想法,支持你的观点,与气泡膜相比 :) - Sandy

12
  Regex RgxUrl = new Regex("[^a-z0-9]");
                    blnContainsSpecialCharacters = RgxUrl.IsMatch(stringToCheck);

2
这将接受à,这对于OP来说是一个特殊字符吗?(当然不是,OP已经接受了答案) - user757095

9

Linq是新潮流。

string.Any(c => char.IsSymbol(c));

对于IsSymbol()函数,有效的符号包括UnicodeCategory的成员。
  • 类似字母的符号,包括一组数学字母数字符号以及诸如℅、№和™等符号
  • 数字形式,例如下标和上标
  • 数学运算符和箭头
  • 几何符号
  • 技术符号
  • 布莱叶盲文点字
  • 装饰符号

编辑:

这不能捕获所有字符。可以补充使用以下内容:

string.Any(c => !char.IsLetterOrDigit(c));

我认为字符串中没有任何方法,我猜你的意思是stringValue,因为string是C#关键字。 - Srivathsa Harish Venkataramana
在C#中,string关键字是String的别名,使得String和string等效。由于String对象是表示字符串的System.Char对象的顺序集合,因此您可以使用Linq方法,如Any()或IndexOf()。 - Mike B.
如果在输入字符串上使用Any而不是关键字"string",则你所说的是正确的。 - Srivathsa Harish Venkataramana

5

以下是使用LINQ检查特殊字符的简短解决方案:

private bool ContainsSpecialChars(string value)
{
        var list = new[] {"~", "`", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "+", "=", "\""};
        return list.Any(value.Contains);
}

1
//apart from regex we can also use this
string input = Console.ReadLine();
            char[] a = input.ToCharArray();
            char[] b = new char[a.Length];
            int count = 0;
            for (int i = 0; i < a.Length; i++)
            {
                if (!Char.IsLetterOrDigit(a[i]))
                {
                    b[count] = a[i];
                    count++;
                }
            }
            Array.Resize(ref b, count);
            foreach(var items in b)
            {
                Console.WriteLine(items);
            }
            Console.ReadLine();
//it will display the special characters in the string input

1

我试图实现一个不同的结果。创建一种方法,返回用于分隔给定字符串(例如1#4#5)的特殊字符,然后使用它来拆分同一字符串。 由于我维护的系统由许多不同的人构建,在某些情况下,我不知道哪种模式(通常没有),以下内容对我帮助很大。目前我还不能进行投票。

public String Separator(){
      **String specialCharacters = "%!@#$#^&*()?/>.<:;\\|}]{[_~`+=-" +"\"";**
      char[] specialCharactersArray = specialCharacters.toCharArray();
      char[] a = entrada.toCharArray();
      for(int i = 0; i<a.length; i++){
          for(int y=0; y < specialCharactersArray.length; i++){
              if(a[i] == specialCharactersArray[y]){
                  separator = String.valueOf(specialCharactersArray[y]);   
              }
          }
      }
      return separator;
    }

谢谢大家。

0
public static bool HasSpecialCharacters(string str)
{
  string specialCharacters = @"%!@#$%^&*()?/>.<,:;'\|}]{[_~`+=-" +"\"";
  char[] specialCharactersArray = specialCharacters.ToCharArray();

  int index = str.IndexOfAny(specialCharactersArray);
  //index == -1 no special characters
  if (index == -1)
    return false;
  else
    return true;
}

-1
def splchar(str):
splchar=("~", "`", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "+", "=")
for chr in splchar:
    if (chr in str):
        print("not accepted")
        break
else:
        print("accepted")
str="GeeksForGeeks"

splchar(str)


-1

另外...

foreach (char character in "some*!@#@!#string")
        {
            if(!Char.IsLetterOrDigit(character))
            {
                //It is a special character.
            }
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接