Xác minh rằng một chuỗi chỉ chứa các chữ cái trong C #


186

Tôi có một chuỗi đầu vào và tôi muốn xác minh rằng nó có chứa:

  • Chỉ các chữ cái hoặc
  • Chỉ có chữ cái và số hoặc
  • Chỉ chữ cái, số hoặc gạch dưới

Để làm rõ, tôi có 3 trường hợp khác nhau trong mã, mỗi trường hợp gọi để xác nhận khác nhau. Cách đơn giản nhất để đạt được điều này trong C # là gì?

Câu trả lời:


291

Chỉ những lá thư:

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

Chỉ có chữ cái và số:

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

Chỉ các chữ cái, số và dấu gạch dưới:

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

31
Điều này giả định một bảng chữ cái Latin, trong đó Char.IsLetter cho phép các bảng chữ cái phi Latin.
Paul van Brenk

5
Regex.IsMatch (đầu vào, "^ [a-z0-9] + $", RegexOptions.IgnoreCase);
Tom Fobear

4
@TomFobear: điều này chậm hơn so với việc chỉ định rõ ràng [a-zA-Z]
Philippe Leybaert

25
Chỉ để cứu những người như tôi khỏi một lần tìm kiếm khác, Regex nằm trong System.Text.RegularExpressions Namespace
Eric Barr

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

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

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

5
Tôi sẽ tò mò muốn biết cái nào nhanh hơn của bạn (LINQ) hay cái nào từ Philippe Leybaert (Regex)?
nam

4
@nam Chạy thử nghiệm với Từ điển phát âm CMU (chỉ tất cả các chữ cái, độ dài trung bình 7,4 ký tự), tốc độ này nhanh hơn 1,8 lần so với biên dịch Regexcho tất cả các chữ cái và nhanh hơn 3 lần so với biên dịch Regexcho tất cả các chữ cái có IgnoreCasetùy chọn (!).
NetMage

Câu trả lời được chấp nhận sử dụng Regex chưa biên dịch, điều đó sẽ còn chậm hơn. Tôi thích giải pháp LINQ, cảm ơn vì đã đăng nó :)
Berend Engelbrecht

48

Chỉ thư:

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

Chữ và số:

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

Chữ cái, số và dấu gạch dưới:

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

Lưu ý, các mẫu này cũng khớp với các ký tự quốc tế (trái ngược với việc sử dụng a-zcấu trúc).


19

Đối với những người bạn không muốn dùng Regex và trên .NET 2.0 Framework (AKA no LINQ):

Chỉ những lá thư:

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

Chỉ các số:

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

Chỉ số hoặc chữ cái:

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

Chỉ số hoặc chữ hoặc dấu gạch dưới:

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

8

Tôi nghĩ là một trường hợp tốt để sử dụng Biểu thức chính quy:

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
Regex có các phương thức tĩnh cho việc này
Philippe Leybaert

4

Bạn có thể lặp trên các ký tự của chuỗi và kiểm tra bằng Char Phương thức IsLetter nhưng bạn cũng có thể thực hiện một mẹo sử dụng phương thức Chuỗi IndexOfAny để tìm kiếm các công cụ tìm kiếm khác không có trong chuỗi.


1

Lặp lại thông qua các ký tự chuỗi và sử dụng các hàm của 'Char' được gọi là 'IsLetter' và 'IsDigit'.

Nếu bạn cần một cái gì đó cụ thể hơn - hãy sử dụng lớp Regex.


1

Nếu bạn là người mới thì bạn có thể tham khảo từ mã của tôi .. những gì tôi đã làm là đặt một tấm séc để tôi chỉ có thể nhận được Bảng chữ cái và khoảng trắng! Bạn có thể Lặp lại vòng lặp for sau câu lệnh if thứ hai để xác thực lại chuỗi

       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

Gần đây, tôi đã thực hiện các cải tiến hiệu suất cho một chức năng kiểm tra các chữ cái trong một chuỗi với sự trợ giúp của trang này.

Tôi đã tìm ra rằng các Giải pháp với regex chậm hơn 30 lần so với các giải pháp với kiểm tra Char.IsLetterOrDigit.

Chúng tôi không chắc chắn rằng những Chữ cái hoặc Chữ số đó bao gồm và chúng tôi chỉ cần các ký tự Latinh nên đã triển khai chức năng của chúng tôi dựa trên phiên bản dịch ngược của hàm Char.IsLetterOrDigit.

Đây là giải pháp của chúng tôi:

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

Và cách sử dụng là như thế này:

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

0

Vui lòng tìm phương thức để xác thực nếu char là chữ cái, số hoặc dấu cách, nếu không thì đính kèm dấu gạch dưới (Được tự do sửa đổi theo nhu cầu của bạn)

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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.