【问题标题】:Check for special characters (/*-+_@&$#%) in a string?检查字符串中的特殊字符(/*-+_@&$#%)?
【发布时间】:2011-05-29 01:27:52
【问题描述】:

如何检查字符串以确保它只包含数字、字母或空格?

【问题讨论】:

  • 如果您为字符串编写扩展方法,则可以内置检查。您也可以使用已经编写好的方法,例如 Extensions.cs NuGet 包,它使其变得如此简单:例如: "abcXYZ123".IsAlphaNumeric() 将返回 True,而 "abcXYZ123@".IsAlphaNumeric() 将返回 False。默认情况下, .IsAlphaNumeric() 中会忽略空格,但您可以将空格设置为无效字符: "abc 123".IsAlphaNumeric(false) 将返回 False。

标签: c# regex


【解决方案1】:

简单:

function HasSpecialChars(string yourString)
{
    return yourString.Any( ch => ! Char.IsLetterOrDigit( ch ) )
}

【讨论】:

  • 为什么不赞成这个答案?对我来说似乎是正确和快速的。比潜入正则表达式世界解决这样一个简单的问题要好得多
  • @MarcelloGrechiLins Regex 完全有效,并且在使用已编译的 Regex 并在大量字符串中重新使用它时可能更快。像往常一样,软件开发需要权衡取舍。 :-)
  • 我实际上会否决这一点 - 只需进行最少的测试,它就会为 \n 带来正确的结果,我怀疑有人想要这样。正则表达式至少会将其限制为实际的特殊字符。
  • @Charles 阅读原始问题:“如何检查字符串以确保它仅包含数字、字母或空格?”代码 sn-p 满足要求。
  • 确实如此。我的错,回答了这个问题并将它与另一篇关于只获取特殊字符的帖子混淆了。
【解决方案2】:

使用正则表达式最简单的方法:

Regular Expression for alphanumeric and underscores

在.net中使用正则表达式:

http://www.regular-expressions.info/dotnet.html

MSDN Regular Expression

Regex.IsMatch

var regexItem = new Regex("^[a-zA-Z0-9 ]*$");

if(regexItem.IsMatch(YOUR_STRING)){..}

【讨论】:

  • 我为我的实用程序类创建了这个辅助函数。它工作完美public static bool ContainsOnlyAlphaNumericCharacters(this string inputString) { var regexItem = new Regex("^[a-zA-Z0-9 ]*$"); return regexItem.IsMatch(inputString); }
【解决方案3】:
string s = @"$KUH% I*$)OFNlkfn$";
var withoutSpecial = new string(s.Where(c => Char.IsLetterOrDigit(c) 
                                            || Char.IsWhiteSpace(c)).ToArray());

if (s != withoutSpecial)
{
    Console.WriteLine("String contains special chars");
}

【讨论】:

    【解决方案4】:

    试试这个方法。

    public static bool hasSpecialChar(string input)
        {
            string specialChar = @"\|!#$%&/()=?»«@£§€{}.-;'<>_,";
            foreach (var item in specialChar)
            {
                if (input.Contains(item)) return true;
            }
    
            return false;
        }
    

    【讨论】:

    • 无法检查“(报价)
    • 您可以通过在字符串中的 " 之前添加转义符 \ 来检查引号。例如:"\|!#$%&/()=?»«@£§€{}。 -;'\"_,";
    【解决方案5】:
    String test_string = "tesintg#$234524@#";
    if (System.Text.RegularExpressions.Regex.IsMatch(test_string, "^[a-zA-Z0-9\x20]+$"))
    {
      // Good-to-go
    }
    

    可以在此处找到示例:http://ideone.com/B1HxA

    【讨论】:

      【解决方案6】:

      如果可接受的字符列表非常小,您可以使用这样的正则表达式:

      Regex.IsMatch(items, "[a-z0-9 ]+", RegexOptions.IgnoreCase);
      

      这里使用的正则表达式查找 az 和 0-9 中的任何字符,包括空格(方括号 [] 内的内容),是否存在一个或多个这些字符(+ 符号 - 您可以使用* 为 0 或更多)。最后一个选项告诉正则表达式解析器忽略大小写。

      这将在任何不是字母、数字或空格的情况下失败。要向祝福列表中添加更多字符,请将其添加到方括号内。

      【讨论】:

        【解决方案7】:

        使用下面的正则表达式验证字符串以确保它只包含数字、字母或空格:

        [a-zA-Z0-9 ]
        

        【讨论】:

          【解决方案8】:

          你可以用一个布尔值来做到这一点。我最近一直在学习,发现我可以这样做。在此示例中,我正在检查用户对控制台的输入:

          using System;
          using System.Linq;
          
          namespace CheckStringContent
          {
              class Program
              {
                  static void Main(string[] args)
                  {
                      //Get a password to check
                      Console.WriteLine("Please input a Password: ");
                      string userPassword = Console.ReadLine();
          
                      //Check the string
                      bool symbolCheck = userPassword.Any(p => !char.IsLetterOrDigit(p));
          
                      //Write results to console
                      Console.WriteLine($"Symbols are present: {symbolCheck}");     
                  }
              }
          }
          

          如果字符串中存在特殊字符(symbolCheck),则返回“True”,如果不存在,则返回“False”。

          【讨论】:

            【解决方案9】:

            在这里使用 C# 和 Linq 的好方法:

            public static bool HasSpecialCharacter(this string s)
            {
                foreach (var c in s)
                {
                    if(!char.IsLetterOrDigit(c))
                    {
                        return true;
                    }
                }
                return false;
             }
            

            并像这样访问它:

            myString.HasSpecialCharacter();
            

            【讨论】:

            • 你应该这样写:s.Any(char.IsLetterOrDigit);
            【解决方案10】:
            private bool isMatch(string strValue,string specialChars)
                {
                   return specialChars.Where(x => strValue.Contains(x)).Any();
                }
            

            【讨论】:

            • 这个答案与其他答案相似,但同样完全不同。你能解释一下区别,以及它是如何更好的吗?
            • 对不起,我没有测试它的性能,这只是解决问题的另一种方法
            【解决方案11】:

            虽然有很多方法可以给这只猫换皮,但我更喜欢将这些代码包装到可重用的扩展方法中,这样以后做起来就很简单了。使用扩展方法时,您还可以避免使用 RegEx,因为它比直接字符检查要慢。我喜欢使用 Extensions.cs NuGet 包中的扩展。它使这项检查变得如此简单:

            1. 将 [https://www.nuget.org/packages/Extensions.cs][1] 包添加到您的项目中。
            2. 将“using Extensions;”添加到代码顶部。
            3. "smith23@".IsAlphaNumeric() 将返回 False,而 "smith23".IsAlphaNumeric() 将返回 True。默认情况下,.IsAlphaNumeric() 方法忽略空格,但它也可以被覆盖,这样"smith 23".IsAlphaNumeric(false) 将返回 False,因为空格不被视为字母表的一部分。
            4. 其余代码中的所有其他检查都只是MyString.IsAlphaNumeric()

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-01-14
              • 2013-11-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-04-22
              相关资源
              最近更新 更多