验证字符串在C#中仅包含字母


187

我有一个输入字符串,我想验证它是否包含:

  • 仅字母或
  • 仅字母和数字或
  • 仅字母,数字或下划线

为了澄清,我在代码中有3种不同的情况,每种情况都要求不同的验证。在C#中最简单的方法是什么?

Answers:


292

仅字母:

Regex.IsMatch(input, @"^[a-zA-Z]+$");

仅字母和数字:

Regex.IsMatch(input, @"^[a-zA-Z0-9]+$");

仅字母,数字和下划线:

Regex.IsMatch(input, @"^[a-zA-Z0-9_]+$");

31
假设使用拉丁字母,其中Char.IsLetter允许使用非拉丁字母。
Paul van Brenk

5
Regex.IsMatch(input,“ ^ [a-z0-9] + $”,RegexOptions.IgnoreCase);
Tom Fobear 2011年

4
@TomFobear:这比显式指定[a-zA-Z]慢
Philippe Leybaert 2011年

25
为了使像我这样的人免于再搜索,Regex位于System.Text.RegularExpressions命名空间中
Eric Barr 2014年

241
bool result = input.All(Char.IsLetter);

bool result = input.All(Char.IsLetterOrDigit);

bool result = input.All(c=>Char.IsLetterOrDigit(c) || c=='_');

5
我很想知道您使用的是哪一种速度更快(LINQ)还是Philippe Leybaert的速度更快(Regex)?
2015年

4
@nam针对CMU发音词典(仅所有字母,平均长度7.4个字符)运行测试,这比Regex所有字母的编译速度快1.8倍,比Regex带有IgnoreCase选项(!)的所有字母编译速度快3倍。
NetMage

接受的答案使用未编译的Regex,这会更慢。我更喜欢LINQ解决方案,感谢您发布它:)
Berend Engelbrecht

48

仅字母:

Regex.IsMatch(theString, @"^[\p{L}]+$");

字母和数字:

Regex.IsMatch(theString, @"^[\p{L}\p{N}]+$");

字母,数字和下划线:

Regex.IsMatch(theString, @"^[\w]+$");

请注意,这些模式还匹配国际字符(与使用a-z构造相反)。


19

对于那些不想使用Regex并使用.NET 2.0 Framework(又名LINQ)的人:

仅字母:

public static bool IsAllLetters(string s)
{
    foreach (char c in s)
    {
        if (!Char.IsLetter(c))
            return false;
    }
    return true;
}

仅数字:

    public static bool IsAllDigits(string s)
    {
        foreach (char c in s)
        {
            if (!Char.IsDigit(c))
                return false;
        }
        return true;
    }

仅数字或字母:

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

仅数字或字母或下划线:

    public static bool IsAllLettersOrDigitsOrUnderscores(string s)
    {
        foreach (char c in s)
        {
            if (!Char.IsLetterOrDigit(c) && c != '_')
                return false;
        }
        return true;
    }

8

我认为使用正则表达式是一个很好的例子:

public bool IsAlpha(string input)
{
    return Regex.IsMatch(input, "^[a-zA-Z]+$");
}

public bool IsAlphaNumeric(string input)
{
    return Regex.IsMatch(input, "^[a-zA-Z0-9]+$");
}

public bool IsAlphaNumericWithUnderscore(string input)
{
    return Regex.IsMatch(input, "^[a-zA-Z0-9_]+$");
}

2
正则表达式对此具有静态方法
Philippe Leybaert 2009年

4

您可以循环使用字符串的字符,并使用Char方法IsLetter进行检查, 但是也可以使用字符串方法IndexOfAny进行技巧,以搜索未包含在字符串中的其他字符。


1

遍历字符串字符,并使用名为“ IsLetter”和“ IsDigit”的“ Char”函数。

如果您需要更具体的内容,请使用Regex类。


1

如果您是新手,那么您可以从我的代码中进行引用..我所做的就是检查一下,这样我只能得到字母和空格!您可以在第二条if语句之后重复for循环以再次验证字符串

       bool check = false;

       Console.WriteLine("Please Enter the Name");
       name=Console.ReadLine();

       for (int i = 0; i < name.Length; i++)
       {
           if (name[i]>='a' && name[i]<='z' || name[i]==' ')
           {
               check = true;
           }
           else
           {
               check = false;
               break;
           }

       }

       if (check==false)
       {
           Console.WriteLine("Enter Valid Value");
           name = Console.ReadLine();
       }

0

最近,我借助此页面对用于检查字符串中字母的函数进行了性能改进。

我发现使用正则表达式的解决方案比使用Char.IsLetterOrDigit检查的解决方案慢30倍。

我们不确定这些字母或数字是否包含在内,并且仅需要拉丁字符,因此基于Char.IsLetterOrDigit函数的反编译版本实现了我们的函数。

这是我们的解决方案:

internal static bool CheckAllowedChars(char uc)
    {
        switch (uc)
        {
            case '-':
            case '.':
            case 'A':
            case 'B':
            case 'C':
            case 'D':
            case 'E':
            case 'F':
            case 'G':
            case 'H':
            case 'I':
            case 'J':
            case 'K':
            case 'L':
            case 'M':
            case 'N':
            case 'O':
            case 'P':
            case 'Q':
            case 'R':
            case 'S':
            case 'T':
            case 'U':
            case 'V':
            case 'W':
            case 'X':
            case 'Y':
            case 'Z':
            case '0':
            case '1':
            case '2':
            case '3':
            case '4':
            case '5':
            case '6':
            case '7':
            case '8':
            case '9':
                return true;
            default:
                return false;
        }
    }

用法是这样的:

 if( logicalId.All(c => CheckAllowedChars(c)))
 { // Do your stuff here.. }

0

请找到验证char是字母,数字还是空格的方法,否则请附加下划线(可以根据需要进行修改)

public String CleanStringToLettersNumbers(String data)
{
    var result = String.Empty;

    foreach (var item in data)
    {
        var c = '_';

        if ((int)item >= 97 && (int)item <= 122 ||
            (int)item >= 65 && (int)item <= 90 ||
            (int)item >= 48 && (int)item <= 57 ||
            (int)item == 32)
        {
            c = item;
        }

        result = result + c;
    }

    return result;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.