Bir dizenin sadece C # harfleri içerdiğini doğrulama


187

Bir giriş dizesi var ve içerdiğini doğrulamak istiyorum:

  • Yalnızca harfler veya
  • Yalnızca harfler ve rakamlar veya
  • Yalnızca harfler, sayılar veya alt çizgi

Açıklığa kavuşturmak için, kodda 3 farklı durum var, her biri farklı doğrulama istiyor. Bu C # elde etmenin en basit yolu nedir?

Yanıtlar:


292

Sadece harfler:

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

Yalnızca harfler ve sayılar:

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

Yalnızca harfler, sayılar ve alt çizgi:

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

31
Bu, Char.IsLetter'in latin olmayan alfabelere izin verdiği bir latin alfabesi olduğunu varsayar.
Paul van BRENK

5
Regex.IsMatch (girdi, "^ [a-z0-9] + $", RegexOptions.IgnoreCase);
Tom Fobear

4
@TomFobear: Bu açıkça [a-zA-Z] belirtmekten daha yavaş
Philippe Leybaert

25
Sadece bir tane daha aramadan benim gibi insanları kurtarmak için, Regex System.Text.RegularExpressions ad alanında olduğu
Eric Barr

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

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

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

5
Hangisinin daha hızlı olduğunu (LINQ) veya Philippe Leybaert'ten (Regex) hangisini bilmek isterdim?
nam

4
@nam CMU Telaffuz Sözlüğü'ne karşı bir test yürütme (yalnızca tüm harfler, ortalama uzunluk 7,4 karakter), bu Regextüm harfler için derlenenden 1,8 kat Regex, IgnoreCaseseçenek (!) ile tüm harfler için derlenenden 3 kat daha hızlıdır .
NetMage

Kabul edilen cevap derlenmemiş Regex kullanıyor, bu daha da yavaş olacak. LINQ çözümünü tercih ediyorum, gönderdiğin için teşekkürler :)
Berend Engelbrecht

48

Sadece mektuplar:

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

Harfler ve sayılar:

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

Harfler, sayılar ve alt çizgi:

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

Bu kalıpların uluslararası a-zyapılarla da eşleştiğine dikkat edin ( yapıyı kullanmak yerine ).


19

Regex ile gitmeyi tercih etmeyen ve .NET 2.0 Framework'te (AKA no LINQ) olanlar için:

Sadece harfler:

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

Sadece sayılar:

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

Sadece Sayılar veya Harfler:

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

Yalnızca Rakamlar veya Harfler veya Alt Çizgiler:

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

8

Normal İfadeleri kullanmak için iyi bir durum olduğunu düşünüyorum:

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 bunun için statik yöntemlere sahip
Philippe Leybaert

4

Dize karakterleri döngü ve Char Method IsLetter kullanarak kontrol edebilirsiniz, ancak dize içinde olması gerekiyordu diğer charaters aramak için String yöntemi IndexOfAny kullanarak bir hile yapabilirsiniz .


1

Dizgi karakterleri arasında yineleme yapın ve 'Char'ın' IsLetter 've' IsDigit 'işlevlerini kullanın.

Daha spesifik bir şeye ihtiyacınız varsa - Regex sınıfını kullanın.


1

Eğer bir acemi iseniz o zaman benim kod referans alabilirsiniz .. ne yaptım ben sadece Alfabe ve beyaz boşluk alabilir böylece bir çek koymak oldu! Dizeyi tekrar doğrulamak için for döngüsünü ikinci if ifadesinden sonra tekrarlayabilirsiniz.

       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

Son zamanlarda, bu sayfanın yardımıyla bir dizedeki harfleri kontrol eden bir işlev için performans iyileştirmeleri yaptım.

Normal rex ile Çözümler Char.IsLetterOrDigit kontrol ile olanlardan 30 kat daha yavaş olduğunu anladım.

Bu Harflerin veya Rakamların içerdiğinden emin değildik ve Char.IsLetterOrDigit fonksiyonunun ayrıştırılmış versiyonuna göre fonksiyonumuzu uyguladığımız sadece Latin karakterlere ihtiyacımız vardı.

İşte çözümümüz:

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

Ve kullanım şöyle:

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

0

Lütfen char'ın harf, sayı veya boşluk olup olmadığını doğrulama yöntemini bulun, aksi takdirde alt çizgi ekleyin (Gereksinimlerinize göre değişiklik yapmaktan çekinmeyin)

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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.