यह सत्यापित करना कि स्ट्रिंग में C # में केवल अक्षर हैं


187

मेरे पास एक इनपुट स्ट्रिंग है और मैं सत्यापित करना चाहता हूं कि इसमें शामिल हैं:

  • केवल अक्षर या
  • केवल अक्षर और संख्या या
  • केवल अक्षर, संख्या या अंडरस्कोर

स्पष्ट करने के लिए, मेरे पास कोड में 3 अलग-अलग मामले हैं, प्रत्येक अलग-अलग सत्यापन के लिए बुला रहा है। C # में इसे प्राप्त करने का सबसे सरल तरीका क्या है?

जवाबों:


292

केवल अक्षर:

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

केवल अक्षर और संख्या:

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

केवल अक्षर, संख्या और अंडरस्कोर:

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

31
यह एक लैटिन वर्णमाला मानता है, जहां चार.साल्टर गैर-लैटिन वर्णमाला के लिए अनुमति देता है।
बजे पॉल वैन ब्रेनक

5
Regex.IsMatch (इनपुट, "^ [a-z0-9] + $", RegexOptions.IgnoreCase);
टॉम फोबियर

4
@TomFobear: यह स्पष्ट रूप से निर्दिष्ट करने की तुलना में धीमा है [a-zA-Z]
फिलिप लेबेर्ट

25
मेरे जैसे लोगों को एक और खोज से बचाने के लिए, Regex System.Text.RegularExpressions Namespace
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
मुझे यह जानने की उत्सुकता होगी कि आपका कौन सा तेज़ (LINQ) या फिलिप लेबेर्ट (Regex) में से एक है?
Nam

4
@ सीएमयू उच्चारण शब्दकोश (सभी पत्र केवल, औसत लंबाई 7.4 वर्ण) के खिलाफ एक परीक्षण चल रहा है, यह Regexसभी अक्षरों के लिए संकलित की तुलना में 1.8x तेज है , और विकल्प (!) के Regexसाथ सभी अक्षरों के लिए संकलित की तुलना में 3x तेज है IgnoreCase
नेटमैज

स्वीकृत उत्तर अप्रकाशित रेगेक्स का उपयोग करता है, जो कि धीमा भी होगा। मैं LINQ समाधान पसंद करता हूं, इसे पोस्ट करने के लिए धन्यवाद :)
Berend Engelbrecht

48

केवल खत:

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

पत्र और संख्या:

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

पत्र, संख्या और अंडरस्कोर:

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

ध्यान दें, ये पैटर्न अंतरराष्ट्रीय पात्रों से मेल खाते हैं (जैसा कि a-zनिर्माण का उपयोग करने के लिए विरोध किया गया है )।


19

उन लोगों के लिए जो रेगेक्स के साथ नहीं जाएंगे और .NET 2.0 फ्रेमवर्क (AKA no 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
रेगेक्स के पास इसके लिए स्थिर विधियां हैं
फिलिप लेबेर्ट

4

आप स्ट्रिंग के चार्ट पर लूप कर सकते हैं और चार मेथड IsLetter का उपयोग करके जांच कर सकते हैं, लेकिन स्ट्रिंग में होने के लिए अन्य चार्जर्स को खोजने के लिए आप स्ट्रिंग विधि IndexOfAny का उपयोग करके एक ट्रिक भी कर सकते हैं ।


1

तार वर्णों के माध्यम से Iterate करें और 'IsLetter' और 'IsDigit' नामक 'Char' के कार्यों का उपयोग करें।

यदि आपको कुछ और विशिष्ट की आवश्यकता है - रेगेक्स वर्ग का उपयोग करें।


1

यदि आप एक नौसिखिया हैं तो आप मेरे कोड से संदर्भ ले सकते हैं .. मैंने जो किया वह एक चेक पर रखा था ताकि मुझे केवल अक्षर और सफेद स्थान मिल सकें! यदि आप फिर से स्ट्रिंग को मान्य करने के लिए बयान के बाद दूसरे के लिए लूप के लिए दोहरा सकते हैं

       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

कृपया वर्ण, संख्या या स्थान को सत्यापित करने की विधि खोजें, अन्यथा अंडरस्कोर संलग्न करें (अपनी आवश्यकताओं के अनुसार संशोधित करने के लिए स्वतंत्र रहें)

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;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.