मेरे पास कोणीय 1.6 का उपयोग करने वाली वेबसाइट पर एक फॉर्म है और फ़ील्ड में से एक उपयोगकर्ताओं को खाता आईडी इनपुट करने की अनुमति देता है जिस पर एक क्रिया की जानी चाहिए। (वास्तव में इनमें से कई रूप हैं जो सभी एक ही नियंत्रक द्वारा संचालित हैं।)

उपयोगकर्ताओं को किसी भी गैर-अल्फ़ान्यूमेरिक वर्ण द्वारा आईडी को अलग करने के लिए कहा जाता है।

इन रूपों के कुछ उदाहरणों पर, हालांकि, मुझे उन आईडी की संख्या को सीमित करने की आवश्यकता है जिन्हें निर्दिष्ट किया जा सकता है। (सभी आईडी पैटर्न [a-z0-9] के अनुरूप हैं।) मैं निम्नलिखित RegEx पैटर्न और एनजी-पैटर्न के साथ अपनी जरूरत के करीब पहुंच गया हूं। regexp को app.js में एक var में संग्रहित किया जाता है और var को HTML में संदर्भित किया जाता है:

new RegExp(`^(?:(?=([a-z0-9]+))\\1[^a-zA-Z0-9]*){1,${maxSites}}$`);

दुर्भाग्य से, यह खाता आईडी के बाद अल्पविराम, रिक्त स्थान आदि से भी मेल खाता है। उदाहरण के लिए, मेरा RegEx foobar, ("foobar" के बाद अल्पविराम और एक स्थान से मेल खाता है) जब यह नहीं होना चाहिए।

यहाँ एक तालिका है जो दिखाती है कि मैं maxSites के आधार पर एक कार्यशील RegEx से मेल खाने की क्या अपेक्षा करता हूँ:

Input                       | Max | Max 2 | Max 3
foobar                      | yes |  yes  | yes  
foobar,                     | no  |  no   | no  
foobar,                     | no  |  no   | no  
foobar,bizbaz               | no  |  yes  | yes  
foobar, bizbaz1             | no  |  yes  | yes  
foobar bizbaz1              | no  |  yes  | yes  
foobar, bizbaz1,            | no  |  no   | no  
foobar, bizbaz1, binbong2   | no  |  no   | yes  

क्या RegExp के साथ ऐसा करने का कोई तरीका है?

1
TaishiZiyi 24 अक्टूबर 2017, 23:49

2 जवाब

सबसे बढ़िया उत्तर

यहां वह है जो मैंने जुटाया। ^([a-z0-9]+){1}(,[a-z0-9]+){0,(MAX-1)} यह साइट https://regexr.com/ आपको उन स्ट्रिंग्स का परीक्षण करने देती है जिनका आप परीक्षण करना चाहते हैं और आप देख सकते हैं कि क्या यह मिलान करता है। विचार यह है कि पहले समूह में अल्पविराम नहीं हो सकता है और इसमें केवल एक अल्फ़ान्यूमेरिक स्ट्रिंग हो सकती है। दूसरे समूह में पहले अल्पविराम शामिल है, इसलिए आपके पास कोई पिछला अल्पविराम नहीं हो सकता है और आप 0 से MAX-1 तक दोहरा सकते हैं। आशा है कि ये आपकी मदद करेगा।

0
esselman 25 अक्टूबर 2017, 01:53

जब तक आपके पास रेगेक्स का उपयोग करने के लिए अन्य अधिक आकर्षक कारण न हों, मैं कस्टम सत्यापन फ़ंक्शन का उपयोग करके इसे सत्यापित करना पसंद करूंगा। यह वास्तव में ऐसा लगता है कि आप एक स्ट्रिंग को विभाजित करने का प्रयास कर रहे हैं और फिर सत्यापित करें कि (गैर-रिक्त) तत्वों की संख्या किसी संख्या से कम या उसके बराबर है। string.split और रेगेक्स का उपयोग करने का एक बुरा समय। यहां एक सरल कार्य है जो आपकी स्ट्रिंग के रूप को मान्य करेगा:

function isValidAction(str, max) {
    if (!str || !max)
        return false;

    //split the string by non-alphanumeric
    var actions = str.split(/[^a-zA-Z\d]/);

    //validate length
    var valid = actions.length <= max;
    //validate every element has non-empty content
    valid = valid && actions.every(function(a) {
        return a.length > 0;
    });
    return valid;
}

फिर, बस इसे ng-change के साथ मैन्युअल रूप से कनेक्ट करें और form.element.$setValidity()

प्लंकर पर डेमो

0
ryanyuyu 25 अक्टूबर 2017, 16:08