javascript बिल्कुल 5 नंबर और एक वैकल्पिक स्थान से मेल खाने के लिए रेगेक्स




regex validation (6)

जावास्क्रिप्ट में इनपुट की जांच करने के लिए हाल ही में मुझे एक नियमित अभिव्यक्ति बनाने की आवश्यकता थी I यह इनपुट 5 या 6 वर्ण लंबा हो सकता है और उसमें बिल्कुल 5 संख्याएं और एक वैकल्पिक स्थान होना चाहिए, जो स्ट्रिंग में कहीं भी हो सकता है। मैं बिल्कुल भी नहीं जानता हूं और फिर भी मैं एक बेहतर तरीके से तलाश करने की कोशिश कर रहा हूं, इसके साथ समाप्त हुआ:

(^\d{5}$)|(^ \d{5}$)|(^\d{5} $)|(^\d{1} \d{4}$)|(^\d{2} \d{3}$)|(^\d{3} \d{2}$)|(^\d{4} \d{1}$)  

यह मुझे क्या चाहिए, इसलिए स्वीकृत इनपुट हैं (यदि 0 कोई संख्या है)

'00000'  
' 00000'  
'0 0000'  
'00 000'  
'000 00'  
'0000 0'  
'00000 '

मुझे संदेह है कि यह एकमात्र तरीका है कि regex के साथ इस तरह के मिलान को प्राप्त करना है, लेकिन मुझे इसे क्लीनर तरीके से करने का कोई तरीका नहीं मिला है। तो मेरा सवाल यह है, यह कैसे बेहतर लिखा जा सकता है?

धन्यवाद।

संपादित करें:
तो, यह संभव है! टॉम लॉर्ड्स का उत्तर मुझे नियमित अभिव्यक्ति के लिए आवश्यक था, इसलिए मैंने इसे मेरे प्रश्न का सही उत्तर मान लिया।

हालांकि, मैंने इस प्रश्न को पोस्ट करने के तुरंत बाद, मुझे एहसास हुआ कि मैं सही नहीं सोच रहा था, क्योंकि प्रोजेक्ट में हर दूसरे इनपुट को आसानी से 'मान्ययोग्य' था, मैं तुरंत सोच रहा था कि मैं इसके साथ इस एक को मान्य कर सकता हूं।

बाहर निकल जाता है मैं यह कर सकता था:

const validate = function(value) {
    const v = value.replace(/\s/g, '')
    const regex = new RegExp('^\\d{5}$');
    return regex.test(v);
}  

शांत उत्तर और विचारों के लिए धन्यवाद! :)

संपादित करें 2: मैं एक संभावित महत्वपूर्ण विवरण का उल्लेख करना भूल गया, जो कि यह इनपुट सीमित है, इसलिए उपयोगकर्ता केवल 6 वर्ण तक दर्ज कर सकता है। मैं क्षमाप्रार्थी हूं।


नोट: इस समस्या को हल करने के लिए एक नियमित अभिव्यक्ति का उपयोग करना शायद सबसे अच्छा जवाब न हो। जैसा कि नीचे दिया गया है , यह साधारण कार्य के साथ अंकों और स्थान की गणना करना आसान हो सकता है!

हालांकि, चूंकि सवाल एक regex उत्तर के लिए पूछ रहा था, और कुछ परिस्थितियों में आप इसे एक regex (उदाहरण के लिए यदि आप एक निश्चित पुस्तकालय के कार्यान्वयन के लिए बंद कर रहे हैं) के साथ हल करने के लिए मजबूर हो सकता है, तो निम्नलिखित उत्तर उपयोगी हो सकता है:

इस regex मिलान 5 बिल्कुल युक्त अंक लाइनों:

^(?=(\D*\d){5}\D*$)

यह regex एक वैकल्पिक स्थान युक्त लाइनों से मेल खाता है:

^(?=[^ ]* ?[^ ]*$)

अगर हम उन्हें एक साथ रखते हैं, और यह भी सुनिश्चित करते हैं कि स्ट्रिंग में केवल अंक और रिक्त स्थान ( [\d ]*$ ) हैं, तो हम प्राप्त करते हैं:

^(?=(\D*\d){5}\D*$)(?=[^ ]* ?[^ ]*$)[\d ]*$

आप उस पैटर्न के अंत में [\d ]* बजाय [\d ]{5,6} का भी उपयोग कर सकते हैं, एक ही प्रभाव के लिए।

डेमो

स्पष्टीकरण:

यह रेगुलर एक्सप्रेशन लुकएहाइड का उपयोग कर रहा है ये शून्य-चौड़ाई वाले पैटर्न matchers हैं, जिसका अर्थ है कि पैटर्न के दोनों हिस्से स्ट्रिंग की शुरुआत के लिए "एंकर" हैं।

  • \d "किसी भी अंक" का अर्थ है, और \D अर्थ "कोई भी अंक नहीं है "

  • "अंतरिक्ष" का अर्थ है, और [^ ] अर्थ है "कोई भी गैर-स्थान "

  • स्ट्रिंग में सटीक 5 अंक सुनिश्चित करने के लिए \D*\d को 5 बार दोहराया जा रहा है।

यहाँ कार्रवाई में regex का एक दृश्य है:

ध्यान दें कि यदि आप वास्तव में "वैकल्पिक स्थान" को टैब जैसी चीज़ों को शामिल करना चाहते थे, तो आप इसके बजाय \s और \S उपयोग कर सकते थे

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

ऊपर दिए अपने उत्तर के लिए कई "सरल" प्रकार के समाधान हैं, जैसे:

// Only look for digits and spaces, not "non-digits" and "non-spaces":
^(?=( ?\d){5} *$)(?=\d* ?\d*$)

// Like above, but also simplifying the second lookahead:
^(?=( ?\d){5} *$)\d* ?\d*

// Or even splitting it into two, simpler, problems with an "or" operator: 
^(?:\d{5}|(?=\d* \d*$).{6})$

ऊपर दिए गए प्रत्येक पंक्ति का डेमोः 1 2 3

या यहां तक ​​कि अगर हम यह मान सकते हैं कि स्ट्रिंग 6 वर्णों से अधिक नहीं है, तब भी यह पर्याप्त है:

^(?:\d{5}|\d* \d*)$

तो इस बात को ध्यान में रखते हुए, आप इसी तरह की समस्याओं के लिए मूल समाधान का उपयोग क्यों कर सकते हैं? क्योंकि यह सामान्य है मेरे मूल उत्तर पर फिर से देखें, फ्री-स्पेसिंग के साथ फिर से लिखा हुआ है:

^
(?=(\D*\d){5}\D*$) # Must contain exactly 5 digits
(?=[^ ]* ?[^ ]*$)  # Must contain 0 or 1 spaces
[\d ]*$            # Must contain ONLY digits and spaces

लगातार नज़र रखने का उपयोग करने के इस पैटर्न को विभिन्न परिदृश्यों में इस्तेमाल किया जा सकता है , जो अत्यधिक संरचित पैटर्न और (शायद आश्चर्यजनक) विस्तार करने में आसान है।

उदाहरण के लिए, मान लीजिए कि नियम बदल गए हैं और अब आप 2-3 रिक्त स्थान, 1 से मिलान करना चाहते हैं . और किसी भी संख्या में हाइफ़न वास्तव में regex को अपडेट करना बहुत आसान है:

^
(?=(\D*\d){5}\D*$)       # Must contain exactly 5 digits
(?=([^ ]* ){2,3}[^ ]*$)  # Must contain 2 or 3 spaces
(?=[^.]*\.[^.]*$)        # Must contain 1 period
[\d .-]*$   # Must contain ONLY digits, spaces, periods and hyphens

... तो संक्षेप में, "सरल" रिगेक्स समाधान हैं, और ओपी की विशिष्ट समस्या के लिए काफी संभवतः गैर-रिजेक्स समाधान। लेकिन मैंने जो प्रदान किया है वह इस प्रकृति के मिलान के पैटर्न के लिए एक सामान्य, एक्स्टेंसिबल डिज़ाइन पैटर्न है।


यहां काम करने के लिए एक सरल regex है:

^(?=[\d ]{5,6}$)\d*\s?\d*$

स्पष्टीकरण:

^ स्ट्रिंग की शुरुआत में स्थिति पर जोर देती है

सकारात्मक लुकहेड (? = [\ D] {5,6} $)

दावा करें कि नीचे रेगेक्स मेल खाता है

नीचे दी गई सूची में मौजूद एक एकल अक्षर से मेल करें [\ d] {5,6}

{5,6} क्वांटिफायर - जितना संभव हो उतना बार 5 से 6 बार के बीच मेल खाता है, आवश्यकतानुसार लौटाना (लालची)

\ d एक अंक से मेल खाता है ([0- 9] के बराबर) अक्षर से अक्षर से मेल खाता है (केस संवेदनशील)

$ स्ट्रिंग के अंत में स्थिति को सक्रिय करता है \ d * एक अंक से मेल खाता है ([0- 9] के बराबर)

  • क्वांटिफायर - शून्य और असीमित समय के बीच मिलान, जितनी बार संभव हो, आवश्यकतानुसार वापस लौटाना (लालची)

\ s किसी भी श्वेत स्थान के चरित्र से मेल खाता है ([\ r \ n \ t \ f \ v] के बराबर)

\ d * एक अंक से मेल खाता है ([0- 9] के बराबर)

  • क्वांटिफायर - शून्य और असीमित समय के बीच मिलान, जितनी बार संभव हो, आवश्यकतानुसार वापस लौटाना (लालची)

$ स्ट्रिंग के अंत में स्थित स्थिति का दावा करता है


मेरा सुझाव है कि पहले पांच नंबर ^\d{5}$ लिए जाँच करें या छह वर्णों के बीच ^(?=\d* \d*$) संख्याओं के बीच एक एकल स्थान के लिए आगे देखें .{6}$

उन आंशिक अभिव्यक्ति का संयोजन मिलाकर ^\d{5}$|^(?=\d* \d*$).{6}$ :

let regex = /^\d{5}$|^(?=\d* \d*$).{6}$/;

console.log(regex.test('00000'));   // true
console.log(regex.test(' 00000'));  // true
console.log(regex.test('00000 '));  // true
console.log(regex.test('00 000'));  // true
console.log(regex.test('  00000')); // false
console.log(regex.test('00000  ')); // false
console.log(regex.test('00  000')); // false
console.log(regex.test('00 0 00')); // false
console.log(regex.test('000 000')); // false
console.log(regex.test('0000'));    // false
console.log(regex.test('000000'));  // false
console.log(regex.test('000 0'));   // false
console.log(regex.test('000 0x'));  // false
console.log(regex.test('0000x0'));  // false
console.log(regex.test('x00000'));  // false

वैकल्पिक रूप से आंशिक अभिव्यक्तियों से अलग रूप से मेल खाते हैं:

/^\d{5}$/.test(input) || input.length == 6 && /^\d* \d*$/.test(input)

यह कैसे मैं regex बिना यह कर सकता है:

string => [...string].reduce(
    ([spaces,digits], char) =>
        [spaces += char == ' ', digits += /\d/.test(char)],
    [0,0]
).join(",") == "1,5";

string="12345 ";
if(string.length<=6 && string.replace(/\s/g, '').length<=5 && parseInt(string,10)){
  alert("valid");
}

आप बस लंबाई की जांच कर सकते हैं और यदि यह एक वैध संख्या है ...


आप इसे आधे में विभाजित कर सकते हैं:

var input = '0000 ';

if(/^[^ ]* [^ ]*$/.test(input) && /^\d{5,6}$/.test(input.replace(/ /, '')))
  console.log('Match');





validation