रेग्क्स टू मैच सिंबल्स:! $% ^ & * () _ + | ~ - = `{} []:"; '<>;;; "


93

मैं जावास्क्रिप्ट में एक रेगेक्स परीक्षण बनाने की कोशिश कर रहा हूं जो इनमें से किसी भी वर्ण को लिखने के लिए एक स्ट्रिंग का परीक्षण करेगा:

!$%^&*()_+|~-=`{}[]:";'<>?,./

अधिक जानकारी अगर आप इच्छुक हैं :)

यह एक बहुत अच्छा पासवर्ड परिवर्तन अनुप्रयोग के लिए काम कर रहा हूँ। मामले में आप यहाँ रुचि रखते हैं बाकी कोड।

मेरे पास एक तालिका है जो पासवर्ड आवश्यकताओं को सूचीबद्ध करती है और जैसे-जैसे नए उपयोगकर्ता पासवर्ड टाइप करते हैं, यह रेगेक्स की एक सरणी का परीक्षण करेगी और इसी तालिका पंक्ति में एक चेकमार्क रखेगी अगर यह ... चेक आउट :) मुझे बस इसे जोड़ने की आवश्यकता है validationसरणी में 4 आइटम के स्थान पर ।

var validate = function(password){
    valid = true;

    var validation = [
        RegExp(/[a-z]/).test(password), RegExp(/[A-Z]/).test(password), RegExp(/\d/).test(password), 
        RegExp(/\W|_/).test(password), !RegExp(/\s/).test(password), !RegExp("12345678").test(password), 
        !RegExp($('#txtUsername').val()).test(password), !RegExp("cisco").test(password), 
        !RegExp(/([a-z]|[0-9])\1\1\1/).test(password), (password.length > 7)
    ]

    $.each(validation, function(i){
        if(this)
            $('.form table tr').eq(i+1).attr('class', 'check');
        else{
            $('.form table tr').eq(i+1).attr('class', '');
            valid = false
        }
    });

    return(valid);

}

हाँ, वहाँ भी इसी सर्वर-साइड सत्यापन है!


9
यह काफी मजेदार है कि आपके प्रश्न का उत्तर विशेष पात्रों से बचने और आगे की स्लैश को संलग्न करने के अपवाद के साथ शीर्षक में है।
sciritai

1
क्यों नहीं उपयोग .addClass("check")और .removeClass("check")? और if (someBoolean == true)कोड में देखना हमेशा मुझे परेशान करता है। बस करो if (someBoolean)। या, अभी तक बेहतर, बस करो $(".form table tr").eq(i+1).toggleClass("check", !!this); valid = valid && !!this;
gilly3

कोड की समीक्षा के लिए +1 @ gill3 thx- बढ़िया प्रतिक्रिया। मैंने अतीत में उन शॉर्ट-हैंड तरीकों का इस्तेमाल किया है।
पिक्सलबॉबी 17

@ gilly3, यह FF लेकिन! IE8 में शानदार काम करता है। इस छोटे हाथ से प्यार करो। मैं यह जानने की कोशिश कर रहा हूं कि IE8 अलग क्या कर रहा है।
पिक्सेल डेब्यू

जवाबों:


171

इसके लिए नियमित अभिव्यक्ति वास्तव में सरल है। बस एक चरित्र वर्ग का उपयोग करें। चरित्र वर्गों में हाइफ़न एक विशेष चरित्र है, इसलिए इसे पहले होना चाहिए:

/[-!$%^&*()_+|~=`{}\[\]:";'<>?,.\/]/

आपको अन्य नियमित अभिव्यक्ति रूपक से बचने की भी आवश्यकता है।

संपादित करें: हाइफ़न विशेष है क्योंकि इसका उपयोग वर्णों की एक श्रृंखला का प्रतिनिधित्व करने के लिए किया जा सकता है। यह एक ही वर्ण वर्ग को श्रेणियों के साथ सरल बनाया जा सकता है:

/[$-/:-?{-~!"^_`\[\]]/

तीन रेंज हैं। '$' से '/', ':' से '?', और '{' से '~'। वर्णों के अंतिम तार को एक सीमा के साथ और अधिक सरलता से नहीं दिखाया जा सकता है:! "^ _` []।

चरित्र वर्गों के लिए रेंज खोजने के लिए एक ACSII तालिका का उपयोग करें ।


वर्णों के अनुक्रम से बचने के लिए क्वांटिफायर \ क्यू और \ ई का उल्लेख क्यों नहीं किया गया है?
सर्जना

इस समाधान को खोजने से पहले मैं वर्ण वर्ग बहिष्करण मार्ग से नीचे जा रहा था: BUT अल्फा, अंक, श्वेत स्थान, आदि
पीट एल्विन

1
क्या यह सामान्य ज्ञान है कि हाइफ़न को पहले आना है? मैंने एसओ के दर्जनों उत्तर पढ़े हैं और रेगेक्स चीट शीट यह पहली बार है जब मैंने इसके बारे में सुना है। आपके उत्तर ने मुझे बहुत नाटक करने से बचाया। धन्यवाद!
CF_HoneyBadger

2
@SerG \Qऔर \EJS RegExp इंजन में काम न करें :(/^\Q.\E$/.test('Q+E'); // true
पॉल एस।

1
@ q4w56 बैकस्लैश मूल प्रश्न में निर्दिष्ट वर्णों के सेट में नहीं है, इसलिए बैकस्लैश का मिलान न करना सही है। :)
जेफ हिलमैन

5

इसे पूरा करने का सबसे सरल और छोटा तरीका:

/[^\p{L}\d\s@#]/u

व्याख्या

[^...] नीचे दी गई सूची में मौजूद एक भी चरित्र का मिलान न करें

  • \p{L} => किसी भी भाषा के किसी भी प्रकार के पत्र से मेल खाता है

  • \d => नौ के माध्यम से एक अंक शून्य से मेल खाता है

  • \s => किसी भी प्रकार के अदृश्य चरित्र से मेल खाता है

  • @# => @और #वर्ण

u(यूनिकोड) ध्वज को पास करना न भूलें ।


आपको संकेत देने के लिए ^ की आवश्यकता नहीं होगी?
वेबर

1
@ वेबर नंबर वे राजधानी में हैं और यह कथन को नकारात्मक बनाता है। ^जरूरत है जब हम उपयोग \wऔर \sछोटे अक्षरों में।
अमीरझ्र

3
क्या यह इसकी व्याख्या नहीं करता है ताकि या तो बाहर wया बाहर s, और उन दोनों के बाद से यह वास्तव में नहीं करता है यह सिर्फ सभी पात्रों के माध्यम से देता है? (इस प्रकार कुछ भी फ़िल्टर नहीं कर रहा है।)
ज़ेल

2
@Zael आप सही हैं, जैसा कि कहा गया है कि नियमित अभिव्यक्ति ( /[\W\S]/) सब कुछ करती है। एक और सटीक प्रतिनिधित्व जो मुझे लगता है कि आमिर पर हो रहा था [^\w\s]। पूर्व में, नियमित अभिव्यक्ति "मैच कुछ भी है जो अल्फ़ान्यूमेरिक नहीं है या जो कि व्हाट्सएप नहीं है" कह रहा है, जिसका आपने उल्लेख किया है कि अल्फ़ान्यूमेरिक वर्णों के माध्यम से सब कुछ व्हाट्सएप और इसके विपरीत नहीं है। उत्तरार्द्ध कहता है "कुछ भी मेल करो जो अल्फ़ान्यूमेरिक नहीं है और जो व्हाट्सएप नहीं है"। बेशक, अपवाद उन उच्चारण पात्रों में लागू होते हैं (जैसे À) से मेल खाते हैं [^\w\s]
जेसी

इसमें
21

4

उत्तर

/[\W\S_]/

व्याख्या

यह वर्ण वर्ण, अंतरिक्ष वर्ण, और अंडरस्कोर वर्ण को वापस जोड़ने के लिए एक वर्ण वर्ग बनाता है (जैसा कि अंडरस्कोर एक "शब्द" वर्ण है)। जो कुछ बचा है, वह विशेष वर्ण है। कैपिटल लेटर्स उनके लोअरकेस समकक्षों की उपेक्षा का प्रतिनिधित्व करते हैं।

\Wसभी गैर "शब्द" वर्णों [^a-zA-Z0-9_]
\Sका चयन करेगा जो सभी गैर "व्हाट्सएप" वर्णों [ \t\n\r\f\v]
_का चयन करेगा जो "_" के बराबर होगा क्योंकि हम इसका उपयोग करते समय इसे नकार देते हैं \Wऔर इसे वापस जोड़ने की आवश्यकता होती है


माइकस्चेम, आप मुझे एक टाइम मशीन के माध्यम से ले गए।
पिक्सेलबॉब

हाँ, मैंने इसे देखा। पुराना था, लेकिन मुझे लगा कि सबसे सरल उत्तर पोस्ट नहीं किया गया है।
माइकशेम

नीचे दिए गए उत्तर से यह कैसे अलग है जो अंडरस्कोर पर विफल रहता है?
sf8193

हां, आप सही हैं मैं इसे संशोधित
करूंगा

-1
// The string must contain at least one special character, escaping reserved RegEx characters to avoid conflict
  const hasSpecial = password => {
    const specialReg = new RegExp(
      '^(?=.*[!@#$%^&*"\\[\\]\\{\\}<>/\\(\\)=\\\\\\-_´+`~\\:;,\\.€\\|])',
    );
    return specialReg.test(password);
  };

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

जब आप सीधे चरित्र से मेल खा सकते हैं तो जटिल लुकहेड का उपयोग क्यों करें?
बरगी

क्या आप @Bergi का उदाहरण दे सकते हैं? मुझे समझ नहीं आ रहा है कि आप क्या सुझाव दे रहे हैं।
अरनी गुडजसन

-1

इसे प्राप्त करने का एक सरल तरीका नकारात्मक सेट [^ \ w \ s] है। यह अनिवार्य रूप से पकड़ता है:

  • कुछ भी जो अल्फ़ान्यूमेरिक वर्ण (अक्षर और संख्या) नहीं है
  • कुछ भी जो स्पेस, टैब या लाइन ब्रेक नहीं है (सामूहिक रूप से व्हाट्सएप के रूप में संदर्भित)

किसी कारण से [\ W \ S] उसी तरह से काम नहीं करता है, यह कोई फ़िल्टरिंग नहीं करता है। ज़ेल की एक टिप्पणी के जवाब में से एक स्पष्टीकरण के कुछ प्रदान करता है।


नहीं, अंडरस्कोर गायब है और एससीआई रेंज से बाहर के सभी वर्ण और एएससीआई रेंज में अधिकांश नियंत्रण वर्ण इस वर्ग से मेल खाते हैं। /[^\w\s]/.test('é') # true, /[^\w\s]/.test('_') # false
कासिमिर एट हिप्पोलाईट

-7

किसी भी भाषा के सभी अक्षरों को 'ए' से बदलें, और यदि आप उदाहरण के लिए सभी अंकों को 0 पर चाहते हैं:

return str.replace(/[^\s!-@[-`{-~]/g, "A").replace(/\d/g, "0");

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