मैं केवल एक वर्णमाला वर्ण की अनुमति देने के लिए एक स्ट्रिंग को कैसे मान्य कर सकता हूं?


117

मैं केवल रेगुलर एक्सप्रेशंस का उपयोग करके एक स्ट्रिंग को कैसे मान्य कर सकता हूं, इसमें केवल अल्फ़ान्यूमेरिक वर्णों की अनुमति है?

(मैं किसी भी स्थान के लिए अनुमति नहीं देना चाहता)।

जवाबों:


181

निम्नलिखित अभिव्यक्ति का उपयोग करें:

^[a-zA-Z0-9]*$

अर्थात:

using System.Text.RegularExpressions;

Regex r = new Regex("^[a-zA-Z0-9]*$");
if (r.IsMatch(SomeString)) {
  ...
}

कैसे जावास्क्रिप्ट के बारे में, एक ही बात मुझे लगता है?
मर्ब्लह

4
यदि आप डेटाबेस के नाम या उस तरह के कुछ आंतरिक को साफ करते हैं, तो आप परवाह नहीं करेंगे यदि यह अंग्रेजी बोलने वाले देश में नहीं चलता है।
ओग्यान दिमित्रोव

15
मैं नियमित अभिव्यक्ति का पता लगाता हूं। मुझे पता है कि मुझे सिंटैक्स याद नहीं होगा। यहां तक ​​कि अगर मैं इसका अध्ययन करता हूं, तो जल्द ही एक समय आएगा जब यह सब फिर से भूल जाएगा।
प्रहरी

1
@Phil। हो सकता है, लेकिन तब तक मैं किसी ऐसे व्यक्ति को सौंप दूंगा जो नियमित अभिव्यक्ति जानता हो ;-)
सेंटिनल

3
यह कहा गया है, "यदि आप नियमित अभिव्यक्ति का उपयोग करके किसी समस्या को हल करते हैं, तो आपको दो समस्याएं हैं।"
ओ। जोन्स

205

.NET 4.0 में आप LINQ का उपयोग कर सकते हैं:

if (yourText.All(char.IsLetterOrDigit))
{
    //just letters and digits.
}

yourText.Allfalseतब से पहली बार char.IsLetterOrDigitरिपोर्ट को निष्पादित करना और वापस करना बंद कर देगा falseक्योंकि तब अनुबंध Allपूरा नहीं किया जा सकता है।

ध्यान दें! यह उत्तर अल्फ़ान्यूमेरिक्स (जो आमतौर पर AZ, az और 0-9 है) की सख्ती से जाँच नहीं करता है। यह उत्तर स्थानीय पात्रों की तरह अनुमति देता है åäö

अपडेट 2018-01-29

उपर्युक्त सिंटैक्स केवल तब काम करता है जब आप एक एकल विधि का उपयोग करते हैं जिसमें सही प्रकार का एक तर्क होता है (इस मामले में char)।

कई शर्तों का उपयोग करने के लिए, आपको इस तरह लिखना होगा:

if (yourText.All(x => char.IsLetterOrDigit(x) || char.IsWhiteSpace(x)))
{
}

1
मुझे आश्चर्य होगा अगर यह बहुत तेज नहीं है। संकलित या मूल्यांकन करने के लिए कोई रेगेक्स नहीं है, बस एक साधारण तुलना है।
jgauffin

3
अब वह सिर्फ सुंदर, सादा और सरल है।
प्रहरी

3
यदि आप यह सुनिश्चित करना चाहते हैं कि यह निश्चित रूप से अल्फ़ान्यूमेरिक है तो क्या यह विफल नहीं होगा? यह या तो सभी अंक या सभी अक्षर हो सकते हैं लेकिन फिर भी इस स्थिति को पूरा करते हैं।
इसका नबंर

2
@itsbalur: हाँ, लेकिन यह सवाल नहीं था।
jgauffin

2
मुझे लगता है कि यह उत्तर बिल्कुल गलत है, अल्फ़ान्यूमेरिक सेट को AZ, az और 0-9 मानते हैं क्योंकि इसमें यूनिकोड अक्षरों और अंकों की पूरी श्रृंखला शामिल है, जिसमें गैर-लैटिन वर्ण भी शामिल हैं। उदाहरण के लिए, char.IsLetterOrDigit('ก')वापस आ जाएगी truecsharppad.com/gist/f96a6062f9f8f4e974f222ce313df8ca
tia

34

आप इसे regex के बजाय एक एक्सटेंशन फ़ंक्शन के साथ आसानी से कर सकते हैं ...

public static bool IsAlphaNum(this string str)
{
    if (string.IsNullOrEmpty(str))
        return false;

    for (int i = 0; i < str.Length; i++)
    {
        if (!(char.IsLetter(str[i])) && (!(char.IsNumber(str[i]))))
            return false;
    }

    return true;
}

प्रति टिप्पणी :) ...

public static bool IsAlphaNum(this string str)
{
    if (string.IsNullOrEmpty(str))
        return false;

    return (str.ToCharArray().All(c => Char.IsLetter(c) || Char.IsNumber(c)));
}

2
यह स्वाद की बात हो सकती है, लेकिन मैं लूप को "फोरच (str c) str {{}} के रूप में व्यक्त करूंगा। क्या एक खाली स्ट्रिंग पर विचार किया जाना ठीक है, यह आवेदन पर निर्भर करता है, इसलिए मैं इसे बाहर निकालूंगा। मैं इस तरह की एक तुच्छ दिनचर्या में 6 खाली लाइनें भी नहीं डालूंगा, लेकिन मुझे लगता है कि सी # / जावा / सी ++ शैली है - कोडर्स स्क्रीन रियल एस्टेट द्वारा भुगतान किए गए लगते हैं। वैसे भी, यह सही दिशा है, इसलिए +1।
स्वेन्ते

3
मुझे लगता है कि हम इस स्थिति में IsDigit का उपयोग करना चाहते हैं, इसके बजाय IsNumber - IsNumber अंकों के लिए सही होगा, या उन चीजों के लिए जो संख्याओं (अंशों, रोमन अंकों, आदि) की तरह दिखते हैं। देखें msdn.microsoft.com/ en-us / पुस्तकालय / yk2b3t2y.aspx )। यह देखते हुए, और यदि कोई विशेष रूप से बुराई महसूस कर रहा था, तो कोई और भी IsAlphaNum की सामग्री को संपीड़ित कर सकता है: वापसी string.IsNullOrEmpty (str)? false: str.ToCharArray ()। सभी (Char.IsLetterOrDigit);
स्टैक

4
ध्यान दें कि Char.IsLetter एक z-Z के अलावा "अक्षर" के लिए सही का मूल्यांकन करेगा। उदाहरण के लिए, जापानी example, चीनी あ, कोरियाई are आदि को यूनिकोड "अक्षर" माना जाता है। यदि यह आपका इरादा है, तो ठीक है, लेकिन अन्य उत्तरों में विभिन्न regex अभिव्यक्तियों को देखते हुए, यह संभवत: अल्फा [न्यूमेरिक] नहीं माना जाता है।
डोनो

मेरे मामले में, IsLetter और IsNumber के अलावा मुझे IsWhiteSpace की भी आवश्यकता थी इसलिए मैंने इसे आपके कोड में जोड़ा और यह पूरी तरह से काम कर गया!
बेन जूनियर

का उपयोग char.IsLetterOrDigitकरने के बजाय IsLetter + ISNUMBER
nick_n_a

17

जबकि मुझे लगता है कि रेगेक्स-आधारित समाधान शायद मैं जिस तरह से जाऊंगा, मैं इसे एक प्रकार से इनकैप्सुलेट करने के लिए लुभाऊंगा।

public class AlphaNumericString
{
    public AlphaNumericString(string s)
    {
        Regex r = new Regex("^[a-zA-Z0-9]*$");
        if (r.IsMatch(s))
        {
            value = s;                
        }
        else
        {
            throw new ArgumentException("Only alphanumeric characters may be used");
        }
    }

    private string value;
    static public implicit operator string(AlphaNumericString s)
    {
        return s.value;
    }
}

अब, जब आपको एक वैध स्ट्रिंग की आवश्यकता होती है, तो आपके पास विधि हस्ताक्षर की आवश्यकता हो सकती है एक AlphaNumericString, और पता है कि यदि आप एक प्राप्त करते हैं, तो यह वैध है (नल के अलावा)। यदि कोई गैर-वैध स्ट्रिंग में पारित करने का प्रयास करता है, तो यह संकलक त्रुटि उत्पन्न करेगा।

आप कट्टरता प्राप्त कर सकते हैं और सभी समानता ऑपरेटरों को लागू कर सकते हैं, या यदि आप परवाह करते हैं, तो सादा ओएलआई स्ट्रिंग से अल्फ़ान्यूमेरिकस्ट्रीमिंग के लिए एक स्पष्ट डाली।


मैंने इस दृष्टिकोण को कभी नहीं देखा है, लेकिन मुझे इरादे की स्पष्टता और आपका औचित्य पसंद है। +1।
Cory House

1
यह मेरे लिए नया है। मैं static public implicit operator stringभाग को समझने की कोशिश कर रहा हूँ
हसन गुलज़ार

8

मुझे AZ, az, 0-9 की जांच करने की आवश्यकता थी; एक रेगेक्स के बिना (भले ही ओपी रेगेक्स पूछता है)।

यहां विभिन्न उत्तरों और टिप्पणियों को सम्मिश्रित करना, और https://stackoverflow.com/a/9975693/292060 से चर्चा , पत्र या अंक के लिए यह परीक्षण, अन्य भाषा के अक्षरों से बचना, और अंश वर्ण जैसे अन्य नंबरों से बचना।

if (!String.IsNullOrEmpty(testString)
    && testString.All(c => Char.IsLetterOrDigit(c) && (c < 128)))
{
    // Alphanumeric.
}

4

^\w+$ अनुमति देगा a-zA-Z0-9_

^[a-zA-Z0-9]+$अंडरस्कोर को हटाने के लिए उपयोग करें ।

ध्यान दें कि इन दोनों को स्ट्रिंग को खाली नहीं होने की आवश्यकता है। खाली तारों *की +अनुमति के बजाय का उपयोग करना ।


मैं आपके ^ \ _ + को भी कैसे बदल सकता हूँ "-" डैश चार की अनुमति देने के लिए?
नील डेविस

@ नीलडाविस^[\w-]+$
ज़ाचफर

2

यह जांचने के लिए कि क्या स्ट्रिंग अक्षर और अंकों दोनों का संयोजन है, आप .NET 4.0 और LINQ का उपयोग करते हुए @jgauffin उत्तर को फिर से लिख सकते हैं:

if(!string.IsNullOrWhiteSpace(yourText) && 
yourText.Any(char.IsLetter) && yourText.Any(char.IsDigit))
{
   // do something here
}

यह गलत तरीके से अल्फ़ान्यूमेरिक के साथ अन्य वर्णों वाले स्ट्रिंग को पहचान
लेगा

1

यहाँ भी वही जवाब ।

यदि आप एक गैर-रेगेक्स ASCII A-z 0-9जांच चाहते हैं, तो आप इसका उपयोग नहीं कर सकते हैं, char.IsLetterOrDigit()जिसमें अन्य यूनिकोड वर्ण शामिल हैं।

आप जो कर सकते हैं, वह वर्ण कोड श्रेणियों की जांच करना है।

  • ४er -> ५ num संख्यावाचक हैं
  • 65 -> 90 बड़े अक्षर हैं
  • 97 -> 122 केस लेटर हैं

निम्नलिखित थोड़ा अधिक क्रिया है, लेकिन यह कोड गोल्फ के बजाय समझने में आसानी के लिए है।

    public static bool IsAsciiAlphaNumeric(this string str)
    {
        if (string.IsNullOrEmpty(str))
        {
            return false;
        }

        for (int i = 0; i < str.Length; i++)
        {
            if (str[i] < 48) // Numeric are 48 -> 57
            {
                return false;
            }

            if (str[i] > 57 && str[i] < 65) // Capitals are 65 -> 90
            {
                return false;
            }

            if (str[i] > 90 && str[i] < 97) // Lowers are 97 -> 122
            {
                return false;
            }

            if (str[i] > 122)
            {
                return false;
            }
        }

        return true;
    }

0

क्लेटस के उत्तर के आधार पर आप नया एक्सटेंशन बना सकते हैं।

public static class StringExtensions
{        
    public static bool IsAlphaNumeric(this string str)
    {
        if (string.IsNullOrEmpty(str))
            return false;

        Regex r = new Regex("^[a-zA-Z0-9]*$");
        return r.IsMatch(str);
    }
}

-8

मैं .NET फ्रेमवर्क में तैयार किए गए और निर्मित कोड पर निर्भर नहीं होने की सलाह देता हूं, नए समाधान लाने की कोशिश करता हूं .. क्योंकि मैं क्या कर रहा हूं ..

public  bool isAlphaNumeric(string N)
{
    bool YesNumeric = false;
    bool YesAlpha = false;
    bool BothStatus = false;


    for (int i = 0; i < N.Length; i++)
    {
        if (char.IsLetter(N[i]) )
            YesAlpha=true;

        if (char.IsNumber(N[i]))
            YesNumeric = true;
    }

    if (YesAlpha==true && YesNumeric==true)
    {
        BothStatus = true;
    }
    else
    {
        BothStatus = false;
    }
    return BothStatus;
}

2
क्या आप कृपया अपने कोड में कुछ स्पष्टीकरण जोड़ सकते हैं, बस डंपिंग कोड आम तौर पर यहाँ पर
फेंक

साथ ही उन्होंने नियमित अभिव्यक्ति के लिए कहा, यह नियमित अभिव्यक्ति नहीं है
ड्रेकन

टिप्पणी और अवलोकन के लिए धन्यवाद..क्या मुझे सलाह है कि कोड लिखने के लिए मेरा अपना दृष्टिकोण है।
महदी अल अरदी

5
.Net में प्री बिल्ड कोड पर भरोसा न करने के बारे में आपकी टिप्पणी से थोड़ा समझ में आता है, निश्चित रूप से अगर आपको प्री-बिल्ड कोड पर भरोसा नहीं करना चाहिए, तो आपको char.IsNumber()विधि का उपयोग नहीं करना चाहिए क्योंकि यह प्री-बिल्ट कोड है?
Draken

4
यह कोड इस बात का एक बड़ा उदाहरण है कि इसे अपने आप में पुनर्निमित करना इतना बुरा विचार क्यों है - यह वास्तव में वह नहीं है जो आप करना चाहते थे! (स्ट्रिंग "@ 1 ए" सच को गलत ढंग से स्ट्रिंग "एक" अवास्तविक लौटाते हैं वापस आ जाएगी,)
Flexo
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.