अल्फ़ान्यूमेरिक और अंडरस्कोर के लिए नियमित अभिव्यक्ति


585

मैं एक नियमित अभिव्यक्ति देना चाहता हूं जो यह जांचती है कि क्या एक स्ट्रिंग में केवल ऊपरी और निचले अक्षर, संख्याएं और अंडरस्कोर शामिल हैं।

regex 

9
यह अफ़सोस की बात है कि अल्फ़ान्यूमेरिक्स से मेल करने के लिए अलग-अलग रेगेक्स इंजनों के अलग-अलग साधन हैं। इस तरह के एक प्रश्न (बल्कि अस्पष्ट, बिना किसी भाषा / रेगेक्स स्वाद के संकेत के) को बहुत लंबे समय तक या प्रत्येक स्वाद पर कम से कम एक बहुत व्यवस्थित उत्तर की आवश्यकता होती है।
विकटोरिया स्ट्राइब्यू

जवाबों:


938

एक स्ट्रिंग से मेल खाने के लिए जिसमें केवल शामिल है वे अक्षर (या एक खाली स्ट्रिंग) हैं, कोशिश करें

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

यह .NET रेग्युलर एक्सप्रेशंस के लिए काम करता है, और शायद बहुत सी अन्य भाषाओं के लिए भी।

इसे तोड़कर:

^ : start of string
[ : beginning of character group
a-z : any lowercase letter
A-Z : any uppercase letter
0-9 : any digit
_ : underscore
] : end of character group
* : zero or more of the given characters
$ : end of string

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


जैसा कि अन्य ने बताया है, कुछ रेगीक्स भाषाओं के लिए एक संक्षिप्त रूप है [a-zA-Z0-9_]। .NET रेगेक्स भाषा में, आप ECMAScript व्यवहार को चालू कर सकते हैं और \wशॉर्टहैंड (उपज ^\w*$या ^\w+$) के रूप में उपयोग कर सकते हैं । ध्यान दें कि अन्य भाषाओं में, और डिफ़ॉल्ट रूप से .NET में, \wकुछ हद तक व्यापक है, और अन्य प्रकार के यूनिकोड वर्णों के साथ भी मेल खाएगा (यह इंगित करने के लिए जनवरी के लिए धन्यवाद)। यदि आप वास्तव में केवल उन वर्णों का मिलान करना चाहते हैं , तो स्पष्ट (लंबा) फ़ॉर्म का उपयोग करना संभवतः सबसे अच्छा है।


8
यदि आप कभी जर्मनी जाते हैं या यदि आप कभी किसी जर्मन पाठ के बारे में देखते हैं तो आप देखेंगे कि मैं क्या कह रहा हूं।
विंडोज प्रोग्रामर

30
\ w और [A-Za-z0-9_] सबसे regex जायके में बराबर नहीं हैं। \ w में
विकृति विज्ञान के

4
मूल प्रश्न में "ऊपरी और निचले अक्षर" कहा गया था, इसलिए ऐसा प्रतीत होगा कि गैर-लैटिन लिपियों के "अक्षर" मेल खाना चाहिए।
तर्जुक

3
[\p{upper}\p{lower}\p{gc=Number}_]क्या आपको यह सही करने की आवश्यकता है, यह मानते हुए कि कोई संयोजन वर्ण नहीं हैं।
tchrist

1
ऐसा लगता है कि preg_match को आपके पैटर्न को सीमांकक के साथ संलग्न करने की आवश्यकता है, जो सामान्य रूप से स्लैश हैं। तो आपको "/ ^ [a-zA-Z0-9 _] * $ /" की आवश्यकता होगी। अधिक जानकारी के लिए यह प्रश्न देखें: stackoverflow.com/questions/6445133/… । इस पृष्ठ को भी देखें: फ़ोरम ।phpfreaks.com
चार्ली

346

यहाँ बहुत अधिक मात्रा में है, और मैं इसके खिलाफ गहराई से हूं, इसलिए, मेरा निर्णायक जवाब होगा:

/^\w+$/

\wके बराबर है [A-Za-z0-9_], जो आप चाहते हैं बहुत सुंदर है। (जब तक कि हम मिक्स में यूनिकोड न डालें)

+क्वांटिफायर का उपयोग करके आप एक या अधिक वर्णों से मेल खाएँगे। यदि आप एक खाली स्ट्रिंग भी स्वीकार करना चाहते हैं, तो *इसके बजाय उपयोग करें ।


67
\wआमतौर पर केवल ASCII तक ही सीमित नहीं है।
tchrist

26
अंग्रेजी दुनिया की एकमात्र भाषा नहीं है, इसलिए यह स्वीकृत उत्तर होना चाहिए, न कि [a-z]इसकी विविधताएं। \wगैर-लैटिन वर्णों को भी कैप्चर करेगा। जैसे šēēāयाкукареку
एलेक्स

1
ओ 'रेली "
मास्टेरिंग

36

आप जाँचना चाहते हैं कि प्रत्येक वर्ण आपकी आवश्यकताओं से मेल खाता है, यही कारण है कि हम उपयोग करते हैं:

[A-Za-z0-9_]

और आप शॉर्टहैंड संस्करण का उपयोग भी कर सकते हैं:

\w

जो समतुल्य है (कुछ रेगेक्स फ्लेवर में, इसलिए सुनिश्चित करें कि आप इसे इस्तेमाल करने से पहले जांच लें)। फिर यह इंगित करने के लिए कि पूरा स्ट्रिंग मेल खाना चाहिए, आप उपयोग करते हैं:

^

इंगित करने के लिए स्ट्रिंग को उस चरित्र से शुरू करना चाहिए, फिर उपयोग करें

$

संकेत करने के लिए स्ट्रिंग को उस चरित्र के साथ समाप्त होना चाहिए। फिर उपयोग करें

\w+ or \w*

"1 या अधिक", या "0 या अधिक" इंगित करने के लिए। यह सब एक साथ रखकर, हमारे पास है:

^\w*$

10
\ w और [A-Za-z0-9_] सबसे regex जायके में बराबर नहीं हैं। \ w में
विकृति विज्ञान के

31

उम ... सवाल: क्या इसके लिए कम से कम एक चरित्र होना चाहिए या नहीं? क्या यह एक रिक्त स्ट्रिंग हो सकती है?

^[A-Za-z0-9_]+$

कम से कम एक ऊपरी या निचले मामले अल्फ़ान्यूमेरिक या अंडरस्कोर करेंगे। यदि यह शून्य लंबाई हो सकती है, तो बस इसके लिए + स्थानापन्न करें *

^[A-Za-z0-9_]*$

संपादित करें:

यदि डियाट्रिटिक्स को शामिल करने की आवश्यकता है (जैसे कि सीडिला - ç) तो आपको शब्द चरित्र का उपयोग करने की आवश्यकता होगी जो उपरोक्त के समान ही है, लेकिन इसमें डियाक्रिटिक वर्ण शामिल हैं:

^\w+$

या

^\w*$

अब जब आप इसका उल्लेख करते हैं, तो मुझे अन्य फ्रांसीसी पात्रों का एक पूरा समूह भी याद आ गया ...
BenAlabaster

1
\ w कम टाइपिंग प्रयास के साथ [\ w] के समान है
Jan Goyvaerts

हाँ, आपको अभी भी + या * और ^ और $ - \ w की आवश्यकता है कि यह जाँचता है कि इसमें शब्द वर्ण शामिल हैं, यह नहीं कि इसमें केवल शब्द वर्ण हैं ...
BenAlabaster

अजीब तरह से, यह अभी भी $ संकेत की अनुमति देता है।
इंडस्टर जूल

@ इंडस्टार, यह इस वजह से है कि बेनअलाबस्टर ने सिर्फ इशारा किया
सेबस

27

हालाँकि यह तुलना में अधिक क्रियात्मक है \w, मैं व्यक्तिगत रूप से पूर्ण पोसिक्स चरित्र वर्ग नामों ( http://www.zytrax.com/tech/web/regex.htm#special ) की पठनीयता की सराहना करता हूं, इसलिए मैं कहूंगा:

^[[:alnum:]_]+$

हालाँकि, उपरोक्त लिंक पर प्रलेखन में कहा गया है कि \w"किसी भी वर्ण का मिलान 0 - 9, A - Z और a - z (POSIX [: alnum:] के बराबर)] में किया जाएगा," मुझे यह सच नहीं लगा है । grep -Pवैसे भी साथ नहीं । यदि आप उपयोग करते हैं, [:alnum:]लेकिन यदि आप उपयोग नहीं करते हैं तो आपको अंडरस्कोर स्पष्ट रूप से शामिल करने की आवश्यकता है \w। आप लघु और मधुर के लिए निम्नलिखित को नहीं हरा सकते हैं:

^\w+$

पठनीयता के साथ-साथ, POSIX चरित्र वर्गों ( http://www. अनियमित-expressions.info/posixbrackets.html) का उपयोग करने का अर्थ है कि आपका regex गैर ASCII स्ट्रिंग्स पर काम कर सकता है, जो कि रेंज आधारित रेग्जेस तब से नहीं करेंगे, जब तक आप इस पर भरोसा नहीं करेंगे। ASCII वर्णों के अंतर्निहित क्रम जो अन्य वर्ण सेटों से भिन्न हो सकते हैं और इसलिए कुछ गैर-ASCII वर्णों (जैसे œ) के अक्षरों को बाहर कर देंगे, जिन्हें आप कैप्चर करना चाहते हैं।


22

कंप्यूटर विज्ञान में, एक अल्फ़ान्यूमेरिक मान का अर्थ अक्सर पहला वर्ण संख्या नहीं होता है, लेकिन एक वर्णमाला या अंडरस्कोर होता है। इसके बाद चरित्र हो सकता है 0-9, A-Z, a-z, या अंडरस्कोर ( _)।

यहां बताया गया है कि आप ऐसा कैसे करेंगे:

Php के तहत परीक्षण किया गया:

$regex = '/^[A-Za-z_][A-Za-z\d_]*$/'

या यह लो

^[A-Za-z_][A-Za-z\d_]*$

और इसे अपनी विकास भाषा में रखें।


17

कैसा रहेगा:

^([A-Za-z]|[0-9]|_)+$

... यदि आप स्पष्ट होना चाहते हैं, या:

^\w+$

... यदि आप संक्षिप्त (पर्ल सिंटैक्स) पसंद करते हैं।


12

"कम से कम एक" सामान करने के लिए लुकहैड्स का उपयोग करें। मेरा विश्वास करो यह बहुत आसान है।

यहां एक उदाहरण दिया गया है जिसमें 1-10 वर्णों की आवश्यकता होगी, जिसमें कम से कम एक अंक और एक अक्षर होगा:

^(?=.*\d)(?=.*[A-Za-z])[A-Za-z0-9]{1,10}$

नोट: इस्तेमाल किया जा सकता है \ w लेकिन फिर ECMA / यूनिकोड विचार \ w "शब्द चरित्र" के चरित्र कवरेज को बढ़ाने में खेलते हैं।


यदि हम सूची में _ और - को जोड़ना चाहते हैं तो हम कैसे करेंगे?
राही

10

इन बहुभाषी एक्सटेंशन की कोशिश करें जो मैंने स्ट्रिंग के लिए किए हैं।

IsAlphaNumeric - स्ट्रिंग में कम से कम 1 अल्फा (यूनिकोड रेंज में पत्र, चारसेट में निर्दिष्ट) और कम से कम 1 नंबर (संख्या में निर्दिष्ट) होना चाहिए। इसके अलावा, स्ट्रिंग में केवल अल्फा और संख्या शामिल होनी चाहिए।

IsAlpha - स्ट्रिंग में कम से कम 1 अल्फा होना चाहिए (भाषा में निर्दिष्ट चार्ट में) और केवल अल्फ़ा शामिल करें।

IsNumeric - स्ट्रिंग में कम से कम 1 नंबर होना चाहिए (निर्दिष्ट भाषा संख्या में) और इसमें केवल संख्याएँ शामिल होती हैं।

वांछित भाषा के लिए चार्ट / अंक सीमा निर्दिष्ट की जा सकती है। यूनिकोड रेंज नीचे लिंक पर उपलब्ध हैं:

http://www.ssec.wisc.edu/~tomw/java/unicode.html

एपीआई:

    public static bool IsAlphaNumeric(this string stringToTest)
    {
        //English
        const string charSet = "a-zA-Z";
        const string numSet = @"0-9";

        //Greek
        //const string charSet = @"\u0388-\u03EF";            
        //const string numSet = @"0-9";

        //Bengali
        //const string charSet = @"\u0985-\u09E3";
        //const string numSet = @"\u09E6-\u09EF";

        //Hindi
        //const string charSet = @"\u0905-\u0963";
        //const string numSet = @"\u0966-\u096F";

        return Regex.Match(stringToTest, @"^(?=[" + numSet + @"]*?[" + charSet + @"]+)(?=[" + charSet + @"]*?[" + numSet + @"]+)[" + charSet + numSet +@"]+$").Success;
    }

    public static bool IsNumeric(this string stringToTest)
    {
        //English
        const string numSet = @"0-9";

        //Hindi
        //const string numSet = @"\u0966-\u096F";

        return Regex.Match(stringToTest, @"^[" + numSet + @"]+$").Success;
    }

    public static bool IsAlpha(this string stringToTest)
    {
        //English
        const string charSet = "a-zA-Z";

        return Regex.Match(stringToTest, @"^[" + charSet + @"]+$").Success;
    }

उपयोग:

        //English
        string test = "AASD121asf";

        //Greek
        //string test = "Ϡϛβ123";

        //Bengali
        //string test = "শর৩৮";

        //Hindi
        //string test = @"क़लम३७ख़";

        bool isAlphaNum = test.IsAlphaNumeric();

@ शाह: मैंने केवल अक्षर जोड़े हैं (और केवल संख्याएँ भी)।
शांतनु

8

निम्नलिखित रेगेक्स अल्फ़ान्यूमेरिक वर्णों और अंडरस्कोर से मेल खाता है:

^[a-zA-Z0-9_]+$

उदाहरण के लिए, पर्ल में:

#!/usr/bin/perl -w

my $arg1 = $ARGV[0];

# check that the string contains *only* one or more alphanumeric chars or underscores
if ($arg1 !~ /^[a-zA-Z0-9_]+$/) {
  print "Failed.\n";
} else {
    print "Success.\n";
}

आपके कोड में पैटर्न सही है, लेकिन ऊपर दिया गया पैटर्न केवल एक उदाहरण की जाँच करता है।
बेनालास्टर

यह जानबूझकर किया गया था, कोड नमूना वास्तव में एक स्ट्रिंग की जाँच में एक स्पष्ट उपयोग के रूप में इरादा था। क्यों कोड में लाइन मार्करों की शुरुआत और अंत भी है जो रेगेक्स उदाहरण में नहीं हैं।
Jay

1
@ विंडोज प्रोग्रामर - en.wikipedia.org/wiki/Alphanumeric - लैटिन वर्णमाला , न कि "लैटिन वर्ण सेट" जिसमें वह है जिसमें डियाट्रिक्टिक्स आदि शामिल हैं। शुद्ध रूप से एक शब्दार्थ अंक, लेकिन मैं व्यक्तिगत रूप से अज़ान के रूप में अल्फ़ान्यूमेरिक शब्द के सामान्य उपयोग के साथ जाता हूं। 0-9।
Jay

2
ñ लैटिन अमेरिका में स्पेनिश सहित वर्णमाला का एक अक्षर है।
विंडोज प्रोग्रामर

2
"मैं एक नियमित अभिव्यक्ति चाहता हूं जो यह जांचता है कि अगर एक स्ट्रिंग में केवल ऊपरी और निचले अक्षर, संख्याएं और अंडरस्कोर शामिल हैं" यह लैटिन अक्षरों तक सीमित नहीं है। "निम्नलिखित रेगेक्स अल्फ़ान्यूमेरिक वर्णों और अंडरस्कोर से मेल खाता है" इसे लैटिन अक्षरों तक सीमित नहीं किया गया है। "^ [a-zA-Z0-9 _] + $" विफल रहता है।
विंडोज प्रोग्रामर

6

यह ज्यादातर मामलों में काम करना चाहिए।

/^[\d]*[a-z_][a-z\d_]*$/gi

और सबसे ज्यादा मेरा मतलब है,

abcd       True
abcd12     True
ab12cd     True
12abcd     True

1234       False


व्याख्या

  1. ^ ... $ - पैटर्न के साथ शुरू और समाप्त होने वाले मैच
  2. [\d]* - शून्य या अधिक अंकों का मिलान करें
  3. [a-z_] - एक वर्णमाला या अंडरस्कोर मैच
  4. [a-z\d_]* - एक वर्णमाला या अंक या अंडरस्कोर मैच
  5. /gi - स्ट्रिंग और केस-असंवेदनशील में विश्व स्तर पर मेल खाता है

2
मूल प्रश्न की आवश्यकता नहीं थी कि पत्र मौजूद होगा।
दिमित्री कुज़मिनोव

आप किस पत्र की बात कर रहे हैं? मेरे रेगेक्स में एक प्रश्न में पूछा गया प्रश्न है। अक्षर, अंक, अंडरस्कोर
चिन्मय पाटी

1234लेखक द्वारा अनुरोध भाषा से शब्द है। आपकी भाषा अधिक प्रतिबंधात्मक है।
दिमित्री कुज़मिनोव

4

मेरे लिए एक मुद्दा यह था कि मैं अल्फा, न्यूमेरिक और अल्फा न्यूमेरिक के बीच अंतर करना चाहता हूं, इसलिए यह सुनिश्चित करने के लिए कि अल्फ़ान्यूमेरिक स्ट्रिंग में कम से कम एक अल्फा और कम से कम एक न्यूमेरिक होता है, मैंने उपयोग किया:

^([a-zA-Z_]{1,}\d{1,})+|(\d{1,}[a-zA-Z_]{1,})+$

वास्तव में मैं क्या चाहता हूँ ... धन्यवाद
अनिकेत kale

3

कम से कम 1 वर्ण और 255 से अधिक वर्णों को निर्दिष्ट करने के लिए आप एक क्वांटिफायर के साथ क्या चाहते हैं, इसके लिए यहां regex दिया गया है

[^a-zA-Z0-9 _]{1,255}

2

यूनिकोड अल्फ़ान्यूमेरिक मिलान की तलाश करने वालों के लिए, आप कुछ ऐसा करना चाहते हैं:

^[\p{L} \p{Nd}_]+$

इसके अलावा http://unicode.org/reports/tr18/ और http://www. अनियमित-expressions.info/unicode.html पर पढ़ रहा है


यदि आप लैटिन को p {L} के बजाय p {लैटिन} चाहते हैं
अगस्टिन

2

मेरा मानना ​​है कि आप अपने मैचों में लैटिन और यूनिकोड वर्ण नहीं ले रहे हैं। उदाहरण के लिए, यदि आपको "ã" या "ü" वर्ण लेने की आवश्यकता है, तो "\ w" का उपयोग काम नहीं करेगा।

आप वैकल्पिक रूप से इस दृष्टिकोण का उपयोग कर सकते हैं:

^[A-ZÀ-Ýa-zà-ý0-9_]+$

आशा है ये मदद करेगा!


1

पूरे स्ट्रिंग की जांच करने के लिए और खाली तारों की अनुमति न दें, प्रयास करें

^[A-Za-z0-9_]+$

1

^\w*$ नीचे संयोजनों के लिए काम करेंगे

1
123
1av
pRo
av1

खाली लाइन का क्या। क्या यह अल्फ़ान्यूमेरिक स्ट्रिंग भी है?
v010dya

0

यह मेरे लिए काम करता है आप कोशिश कर सकते हैं

[\\p{Alnum}_]

0

यह मेरे लिए काम करता है, यह ओ 'रेली की "मास्टेरिंग रेगुलर एक्सप्रेशंस" में पाया गया:

/^\w+$/

स्पष्टीकरण:

  • ^ स्ट्रिंग की शुरुआत में स्थिति का उल्लेख करता है
    • \ w + किसी भी शब्द वर्ण से मेल खाता है ([a-zA-Z0-9_] के बराबर)
    • "+" क्वांटिफायर - एक और असीमित समय के बीच मेल खाता है, जितनी बार संभव हो उतनी बार वापस दे रहा है (लालची)
  • $ स्ट्रिंग के अंत में स्थिति का दावा करता है

स्वयं को सत्यापित करें:

const regex = /^\w+$/;
const str = `nut_cracker_12`;
let m;

if ((m = regex.exec(str)) !== null) {
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

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