2012-04-18 12 views
11

मैं है निम्नलिखित नियमित अभिव्यक्ति जो ब्रिटिश राष्ट्रीय बीमा नंबर सत्यापित करतानियमित अभिव्यक्ति मान्य करने के लिए ब्रिटेन राष्ट्रीय बीमा नंबर

^([a-zA-Z]){2}()?([0-9]){2}()?([0-9]){2}()?([0-9]){2}()?([a-zA-Z]){1}?$ 

स्वीकृत मान हैं:

AB 12 34 56 A 

AB123456A 

मैं इस मान भी स्वीकार किया जा करना चाहते हैं । क्या कोई मुझे इस तरह हल करने में मदद कर सकता है?

AB 123456 A 

AB 123 456 A 

AB 1 2345 6 A 

    AB 12 34 56 A (multiple space anywhere) 

आरई को स्ट्रिंग में अतिरिक्त या कोई रिक्त स्थान होने पर भी काम करना चाहिए। क्या आरई में ऐसा करना संभव है? पहले ही, आपका बहुत धन्यवाद।

+2

आप एक बुरा उदाहरण यहाँ जो इस सवाल (स्वीकार किए जाते हैं जवाब भी शामिल है) के लिए जवाब में से कुछ का कारण है गलत होने के लिए दे दिया है। आपका उदाहरण एनआई संख्या QQ के साथ शुरू होता है। पत्र संख्या एनआई संख्या में उन पदों में से किसी एक में अमान्य है। कृपया एंड्रयू बाउर का जवाब देखें जो सत्यापन नियमों का विवरण देता है। – Barrie

उत्तर

27

संपादित: एंड्रयू Bauer अनुमति/अस्वीकृत वर्ण उस समय मैंने जवाब में अनजान थे के लिए चेक जोड़ने के लिए मेरा उत्तर संशोधित। आपको अपना जवाब अप-वोट देना चाहिए क्योंकि यह अधिक पूर्ण है और स्पष्ट रूप से बेहतर सत्यापन करता है।


तुम सिर्फ पहले सभी सफेद स्थान को निकालना नहीं कर सकते, यह काम करना चाहिए:

^\s*[a-zA-Z]{2}(?:\s*\d\s*){6}[a-zA-Z]?\s*$ 

स्पष्टीकरण:

^     # beginning of string 
\s*    # optional leading whitespace 
[a-zA-Z]{2}  # match two letters 
(?:\s*\d\s*){6} # six digits, with optional whitespace leading/trailing 
[a-zA-Z]?   # zero or one letter 
\s*    # optional trailing whitespace (just in case) 
$     # end of string 
+0

इसके लिए धन्यवाद, और साथ में व्याख्या के लिए धन्यवाद –

2

मुझे लगता है कि इसे पहले सामान्य करना बेहतर है (सभी सफेद-स्पेस वर्णों को हटाएं: \s खाली स्ट्रिंग के साथ प्रतिस्थापित करने के लिए regex), फिर मान्य करें।

^[a-zA-Z]{2}[0-9]{6}[a-zA-Z]{1}$ 
33

वास्तव में, एनआईएन डी की अनुमति नहीं है, एफ, पहले दो अक्षरों के लिए मैं, क्यू, यू या वी और दूसरे पत्र के लिए ओ को अनुमति नहीं देता; इसके शीर्ष पर, उपसर्ग पत्र बीजी, जीबी, एनके, केएन, टीएन, एनटी और जेडजेड नहीं हो सकते हैं। इसके अलावा प्रत्यय पत्र या तो ए, बी, सी या डी है, लेकिन अज्ञात होने पर किसी स्थान द्वारा इसका प्रतिनिधित्व किया जा सकता है। - http://en.wikipedia.org/wiki/National_Insurance_number#Format

जैसे, एक अधिक मान्य जांच होगी (मैं केवल बड़े अक्षरों के साथ एक संस्करण, आसानी से लोअर केस के लिए बदला जा सकता है की आपूर्ति की है):

^(?!BG)(?!GB)(?!NK)(?!KN)(?!TN)(?!NT)(?!ZZ)(?:[A-CEGHJ-PR-TW-Z][A-CEGHJ-NPR-TW-Z])(?:\s*\d\s*){6}([A-D]|\s)$ 
+2

'(? I)' के साथ उपसर्ग करना [एक केस-असंवेदनशील मिलान की अनुमति देनी चाहिए] (http://docs.oracle.com/javase/7/docs/api/java/ util/regex/Pattern.html # विशेष)। – jabley

5

यहाँ सभी जवाब पढ़ने के बाद मैं यह निर्धारित किया है कि इस प्रश्न का स्पष्ट उत्तर नहीं है।

मेरी regex के साथ

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

पीएचपी

preg_replace('/(\s+)|(-)/', '', $str)

जावास्क्रिप्ट

str.replace(/ /g,'')

सत्यापन ब्रिटेन सरकार सलाह (http://www.hmrc.gov.uk/manuals/nimmanual/nim39110.htm) पर आधारित के लिए मैं निम्नलिखित regex का निर्माण किया।

/^[A-CEGHJ-PR-TW-Z]{1}[A-CEGHJ-NPR-TW-Z]{1}[0-9]{6}[A-D]{1}$/i

यहाँ इस regex

/      # Wraps regex 
^      # Beginning of string 
[A-CEGHJ-PR-TW-Z]{1} # Match first letter, cannot be D, F, I, Q, U or V 
[A-CEGHJ-NPR-TW-Z]{1} # Match second letter, cannot be D, F, I, O, Q, U or V 
[0-9]{6}    # Six digits 
[A-D]{1}    # Match last letter can only be A, B, C or D 
$      # End of string 
/i      # Ending wrapper and i denotes can be upper or lower case 

यहाँ कुछ परीक्षण पैटर्न हैं की एक विवरण आप उपयोग कर सकते है

पास

AA 11 22 33 A 
BB 44 55 66 B 
ZZ 67 89 00 C 

विफल

AA 11 22 33 E 
DA 11 22 33 A 
FA 11 22 33 A 
AO 11 22 33 A 

जैसा कि मैंने विस्तार करने के लिए jQuery मैं भी इस शामिल कर रहा हूँ इस नए राष्ट्रीय बीमा संख्या regex जोड़ने के लिए के रूप में यह किसी के लिए उपयोगी हो सकता है मान्य की जरूरत है।

jQuery.validator.addMethod('nino', function(nino, element) { 
      return this.optional(element) || nino.length >= 9 && 
       nino.replace(/ /g,'').match(/^[A-CEGHJ-PR-TW-Z]{1}[A-CEGHJ-NPR-TW-Z]{1}[0-9]{6}[A-D]{1}$/i); 
     }, 'Please specify a valid national insurance number'); 
+0

'{1}' की आवश्यकता नहीं है क्योंकि यह निहित है! –

+0

हालांकि यह अगले व्यक्ति के लिए क्लीनर, अधिक पठनीय कोड बनाता है अगर उन्हें पता नहीं है कि यह अंतर्निहित है। हमें हमेशा आसानी से पठनीय कोड लिखना चाहिए। –

1

मैं सरकार एक्सएमएल दस्तावेज है जो राष्ट्रीय बीमा जो था सत्यापित करने के लिए नियमित अभिव्यक्ति शामिल करने के लिए एक लिंक मिल गया:

[ए-CEGHJ-NOPR-TW-Z] {2} [0-9 ] {6} [एबीसीडी \ एस] {1}

मैंने रेगेक्स ऑनलाइन पर कुछ परीक्षण किया है और यह अच्छी तरह से काम करता है और केवल 4 चरणों में काम करता है।

https://web.archive.org/web/20121026141031/http://webarchive.nationalarchives.gov.uk/+/http://www.cabinetoffice.gov.uk/media/291296/CitizenIdentificationTypes-v1-4.xml

संबंधित मुद्दे