सवाल जावास्क्रिप्ट regex सच लौट रहा है .. तो झूठी .. तो सच .. आदि [डुप्लिकेट]


इस प्रश्न का उत्तर यहां दिया गया है:

मुझे एक फॉर्म पर लिखने के सत्यापन के साथ एक अजीब समस्या है। यह एक इनपुट के बगल में 'उपयोगकर्ता नाम जांचें' बटन है। इनपुट डिफ़ॉल्ट मान उदाहरण के लिए उपयोगकर्ता नाम 'betamax' है। जब मैं 'उपयोगकर्ता नाम जांचें' दबाता हूं तो यह regex पास करता है और उपयोगकर्ता नाम को सर्वर पर भेजता है। सर्वर अपेक्षित व्यवहार करता है और जावास्क्रिप्ट को बताने के लिए '2' देता है कि वे अपना स्वयं का उपयोगकर्ता नाम सबमिट कर रहे हैं।

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

मैं सचमुच यह नहीं समझ सकता कि यह क्या कर रहा है! मेरे लिए इसका कोई अर्थ नहीं है!

संपादित करें: मैंने फ़ायरफ़ॉक्स और क्रोम (मैक) में समस्या का परीक्षण किया है

यह मेरा कोड है:

$j("#username-search").click(checkUserName);

function checkUserName() {
    var userName = $j("#username").val();


    var invalidUserMsg = 'Invalid username (a-zA-Z0-9 _ - and not - or _ at beginning or end of string)';
    var filter = /^[^-_]([a-z0-9-_]{4,20})[^-_]$/gi;
    if (filter.test(userName)) {
        console.log("Pass")
        $j.post(
        "/account/profile/username_check/", 
        { q: userName }, 
        function(data){
            if(data == 0) {
                $j("#username-search-results").html("Error searching for username. Try again?");
            }
            else if(data == 5) {
                $j("#username-search-results").html(invalidUserMsg);
            }
            else if(data == 4) {
                $j("#username-search-results").html("Username too short or too long.");
            }
            else if(data == 2) {
                $j("#username-search-results").html("This is already your username.");
            }
            else if(data == 3) {
                $j("#username-search-results").html("This username is taken.");
            }
            else if(data == 1){
                $j("#username-search-results").html("This username is available!");
            }
        });
    } else {
        console.log("fail")
        $j("#username-search-results").html(invalidUserMsg);
    }

    return false;

}

एचटीएमएल:

<input name="username" id="username" value="{{ user.username }}" />
<input type="button" value="Is it taken?" id="username-search">
<span id="username-search-results"></span>

76
2018-04-13 14:40


मूल




जवाब:


/^[^-_]([a-z0-9-_]{4,20})[^-_]$/gi;

आप एक का उपयोग कर रहे हैं g (वैश्विक) RegExp। जावास्क्रिप्ट में, वैश्विक regexen राज्य है: आप उन्हें (साथ exec, test इत्यादि) पहली बार, आपको दिए गए स्ट्रिंग में पहला मैच मिलता है। उन्हें फिर से कॉल करें और आपको अगला मैच मिल जाएगा, और तब तक जब तक आपको कोई मिलान न मिले और यह अगली स्ट्रिंग की शुरुआत में रीसेट हो जाए। आप भी लिख सकते हैं regex.lastIndex= 0 इस राज्य को रीसेट करने के लिए।

(यह निश्चित रूप से डिजाइन का एक बिल्कुल भयानक टुकड़ा है, भ्रमित करने की गारंटी है और अजीब त्रुटियों का कारण बनता है। जावास्क्रिप्ट में आपका स्वागत है!)

आप छोड़ सकते हैं g अपने से RegExp, क्योंकि आप केवल एक मैच के लिए परीक्षण कर रहे हैं।

इसके अलावा, मुझे नहीं लगता कि आप चाहते हैं [^-_] सामने और पीछे। वह अनुमति देगा कोई प्रत्येक छोर पर चरित्र, यानी। *plop! मान्य होगा। आप शायद लुकहेड / विचार-विमर्श के बारे में सोच रहे हैं, लेकिन वे जावास्क्रिप्ट में उपलब्ध नहीं हैं। (ठीक है, लुकहेड होना चाहिए, लेकिन यह आईई में टूट गया है।) इसके बजाय सुझाव दें:

/^[a-z0-9][a-z0-9_-]{2,18}[a-z0-9]$/i

140
2018-04-13 14:54



मैंने आज कुछ नया सीखा! मैंने कभी जेएस में RegEx से निपटाया नहीं है। :) - Powerlord
बस। मैं आमतौर पर आदत से बाहर / जी शामिल करता हूं लेकिन मुझे लगता है कि मैं अब और नहीं करूँगा! धन्यवाद! - betamax
+1 मैं यह कहना चाहता हूं कि यह पूरी तरह से "रेगेक्सन" शब्द के उपयोग के लिए है, लेकिन यह सभी पहलुओं में एक अच्छा जवाब है ;-) - Andy E
प्रसिद्ध @ बॉबन्स! इसे साझा करने के लिए धन्यवाद। - maček
मुझे लगता है कि महिलाएं उपयोग करती हैं regex.test उनके जवाब देने के लिए कि क्या वे किसी तारीख को बाहर जाएंगे। - toddmo


[a-z0-9-_]

यह गलत है, आखिरी - शुरुआत या अंत में होना चाहिए।

[a-z0-9_-]

चाहे वह इस समस्या का कारण होगा या नहीं, मुझे नहीं पता।

अतिरिक्त नोट्स:

पहले और आखिरी पात्रों को ऐसा कोई चरित्र होने की अनुमति नहीं है जो नहीं है - या _ प्रतिबंधित होने के बजाय a-z0-9

a-z0-9 अपरकेस अक्षर शामिल नहीं है। आप की जरूरत है a-zA-Z0-9 उसके लिए। a-zA-Z0-9_ को छोटा किया जा सकता है \w अधिकांश RegEx इंजनों में। मैंने जावास्क्रिप्ट में कोशिश नहीं की है।


2
2018-04-13 14:44



पारितोषिक के लिए धन्यवाद। आदेश वास्तव में क्यों मायने रखता है? दुर्भाग्य से, जिस समस्या को मैं देख रहा हूं उसे हल नहीं किया। मैंने बस क्रोम में इसका परीक्षण किया (फ़ायरफ़ॉक्स का उपयोग कर रहा था) और यह वही काम करता है। - betamax
-समूहों में एक विशेष चरित्र है ... जैसा कि आप देख सकते हैं, क्योंकि आप इसका उपयोग करते हैं a-z। इसके कारण, इसे केवल शाब्दिक होने के रूप में परिभाषित किया गया है - RegEx के पहले या अंतिम चरित्र के रूप में। ऐसा कहकर, आपको इसे स्विच करने की आवश्यकता हो सकती है [^-_] साथ ही (करने के लिए [^_-])। - Powerlord
ओह, मैंने अभी देखा है कि मैंने रखा है /w के बजाय \w मेरे जवाब में अब तय किया जाना चाहिए। - Powerlord
मेरे पास RegEx के अंत में 'i' ध्वज है जो इसे केस-असंवेदनशील बनाता है। मैंने Regex में एक और दोष देखा है कि यह स्ट्रिंग की शुरुआत में कुछ भी स्वीकार करता है - या _ (यानी बीटामैक्स £ मान्य होगा)। तो इसे ध्यान में रखते हुए और बॉबेंस द्वारा तय फिक्स, अंतिम RegEx है /^[a-z0-9]([a-z0-9_-]{4,20})[a-z0-9]$/i - betamax
आप वैकल्पिक रूप से उपयोग कर सकते हैं \- एक चरित्र समूह में कहीं भी एक शाब्दिक हाइफ़न डालने के लिए। हालांकि यह दृष्टिकोण शायद अधिक पठनीय है! खैर, regex मानकों द्वारा ... @betamax: हाँ, बस खुद को देखा और इसे जोड़ा! :-) - bobince