यूके पोस्टकोड के मिलान के लिए RegEx


185

मैं एक रेगेक्स के बाद हूं जो एक इनपुट स्ट्रिंग के भीतर एक पूर्ण जटिल यूके पोस्टकोड को मान्य करेगा। सभी असामान्य पोस्टकोड फॉर्म को हमेशा की तरह कवर किया जाना चाहिए। उदाहरण के लिए:

माचिस

  • CW3 9SS
  • SE5 0EG
  • SE50EG
  • se5 0eg
  • WC2H 7LT

कोई मुकाबला नहीं

  • aWC2H 7LT
  • WC2H 7LTa
  • WC2H

मैं इस समस्या का समाधान कैसे कर सकता हूं।


2
@axrwkr जो मददगार नहीं दिखता
कीरन बेंटन

8
यूके पोस्टकोड सत्यापन - जावास्क्रिप्ट और पीएचपी मुझे मान्य पोस्टकोड से मिलान करने के लिए स्वीकृत उत्तर नहीं मिल सका, लेकिन मुझे यह मिला और यह वैध पोस्टकोड से मेल खाता है। क्लाइंट साइड सत्यापन के लिए, जावास्क्रिप्ट संस्करण का उपयोग किया जा सकता है, सर्वर साइड सत्यापन के लिए, जावास्क्रिप्ट को C # के रूप में फिर से लिखना काफी सीधा है। यह पोस्टकोड को एक स्थान के लिए भी सुधारता है, इसलिए यदि आप सत्यापन के अलावा W1A1AA के रूप में एक पोस्टकोड दर्ज करते हैं, तो यह इसे W1A 1AA में सुधार करेगा। यहां तक ​​कि यह विभिन्न ब्रिटिश क्षेत्रों में असामान्य पोस्टकोड से संबंधित है।

2
बशर्ते लिंक "AA1A 1AA" प्रारूपों के लिए काम नहीं करता है। संदर्भ: dhl.com.tw/content/dam/downloads/tw/express/forms/…
एंथनी स्कैफ़

1
यदि आप बस एक पोस्टकोड को सत्यापित करना चाहते हैं, तो हम निशुल्क (साइन अप आवश्यक) सत्यापन REST API समापन बिंदु - Developers.alliescomputing.com/postcoder-web-api/address-lookup/…
Stephen Keable

1
अच्छा प्रश्न। मुझे लगता है कि यह एक सामान्य मैनचेस्टर पोस्टकोड जैसे "एम 1 3 एचजेड" जैसे आपकी असामान्य उदाहरणों की सूची में शामिल होने लायक होगा जिन्हें मिलान करने की आवश्यकता है। कई लोगों को 1 अक्षर 1 नंबर के कॉम्बोस के बारे में पता नहीं होता है।
मार्टिन जॉइनर

जवाबों:


207

मैं यूके सरकार डेटा स्टैंडर्ड पर एक नज़र डालने की सलाह दूंगा [लिंक अब मृत; एक्सएमएल का संग्रह , चर्चा के लिए विकिपीडिया देखें ]। डेटा के बारे में एक संक्षिप्त विवरण है और संलग्न एक्सएमएल स्कीमा एक नियमित अभिव्यक्ति प्रदान करता है। यह बिल्कुल वैसा नहीं हो सकता है जैसा आप चाहते हैं बल्कि एक अच्छा शुरुआती बिंदु होगा। RegEx XML से थोड़ा अलग है, प्रारूप A9A 9AA में तीसरे स्थान पर P वर्ण के रूप में दी गई परिभाषा द्वारा अनुमत है।

यूके सरकार द्वारा आपूर्ति की गई RegEx थी:

([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9][A-Za-z]?))))\s?[0-9][A-Za-z]{2})

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


52
और दो खंडों (GIR 0AA) (((AZ- [QVX])] [0-9] [0-9]?] (([AZ- [QVX]] के बीच एक वैकल्पिक सफेद स्थान के साथ पूर्व reg। [AZ- [IJZ]] [0-9] [0-9]) |? (([AZ- [QVX]] [0-9] [ए-HJKSTUW]) | ([AZ- [QVX]] [ AZ- [IJZ]] [0-9] [ABEHMNPRVWXY]))))) \ _? [0-9] [AZ- [CIKMOV]] {2})
gb2d

6
उत्तर के लिए वास्तविक रेगेक्स लाने के लिए एक अच्छा विचार हो सकता है, क्योंकि पेज हर साल समाप्त हो रहे हैं ...
पाउलोया

7
ध्यान दें कि यह रेगेक्स XML स्कीमा के लिए है, जो स्पष्ट रूप से, अन्य रेगेक्स फ्लेवर से थोड़ा अलग है
आर्टब्रिस्टल

6
मुझे यह जावास्क्रिप्ट में काम करने के लिए नहीं मिल सकता है। क्या यह केवल कुछ रेगेक्स इंजनों के साथ काम करता है?
NickG

12
वास्तव में उन्होंने इसे बदल दिया: थोक डेटा ट्रांसफर :^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))[0-9][A-Za-z]{2})$
wieczorek1990

85

ऐसा लगता है कि हम उपयोग करने जा रहे हैं ^(GIR ?0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]([0-9ABEHMNPRV-Y])?)|[0-9][A-HJKPS-UW]) ?[0-9][ABD-HJLNP-UW-Z]{2})$, जो कि ऊपर मिंगलिस द्वारा सस्पेंड किए गए संस्करण का थोड़ा संशोधित संस्करण है।

हालाँकि, हम जांच करने जा रहे हैं कि वास्तव में नियम क्या हैं, क्योंकि ऊपर सूचीबद्ध विभिन्न समाधान अलग-अलग नियमों को लागू करने के लिए प्रकट होते हैं जिसके लिए पत्रों की अनुमति है।

कुछ शोधों के बाद, हमें कुछ और जानकारी मिली है। जाहिरा तौर पर 'govtalk.gov.uk' पर एक पृष्ठ आपको एक पोस्टकोड विनिर्देशन सरकार-पोस्टकोड पर इंगित करता है । पर एक XML स्कीमा के लिए यह अंक XML स्कीमा जो पोस्टकोड नियमों का एक 'छद्म regex' बयान प्रदान करता है।

हमने इसे लिया है और इस पर काम किया है ताकि हमें निम्नलिखित अभिव्यक्ति मिल सके:

^((GIR &0AA)|((([A-PR-UWYZ][A-HK-Y]?[0-9][0-9]?)|(([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRV-Y]))) &[0-9][ABD-HJLNP-UW-Z]{2}))$

यह रिक्त स्थान को वैकल्पिक बनाता है, लेकिन आपको एक स्थान तक सीमित करता है ('{0,} के साथ असीमित स्थानों के लिए' और 'की जगह')। यह मानता है कि सभी पाठ अपर-केस होने चाहिए।

यदि आप किसी भी स्थान के साथ निम्न स्थिति की अनुमति देना चाहते हैं, तो उपयोग करें:

^(([gG][iI][rR] {0,}0[aA]{2})|((([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y]?[0-9][0-9]?)|(([a-pr-uwyzA-PR-UWYZ][0-9][a-hjkstuwA-HJKSTUW])|([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y][0-9][abehmnprv-yABEHMNPRV-Y]))) {0,}[0-9][abd-hjlnp-uw-zABD-HJLNP-UW-Z]{2}))$

यह विदेशी क्षेत्रों को कवर नहीं करता है और केवल प्रारूप को लागू करता है, विभिन्न क्षेत्रों के अस्तित्व को नहीं। यह निम्नलिखित नियमों पर आधारित है:

निम्नलिखित प्रारूप स्वीकार कर सकते हैं:

  • "GIR 0AA"
  • A9 9ZZ
  • A99 9ZZ
  • AB9 9ZZ
  • AB99 9ZZ
  • ए 9 सी 9 जेडजेड
  • AD9E 9ZZ

कहाँ पे:

  • 9 किसी भी एक अंक की संख्या हो सकती है।
  • A, Q, V या X को छोड़कर कोई भी पत्र हो सकता है।
  • I, J या Z को छोड़कर B कोई भी अक्षर हो सकता है।
  • C I, L, M, N, O, P, Q, R, V, X, Y या Z को छोड़कर कोई भी अक्षर हो सकता है।
  • D I, J या Z को छोड़कर कोई भी पत्र हो सकता है।
  • E, A, B, E, H, M, N, P, R, V, W, X या Y में से कोई भी हो सकता है।
  • Z, C, I, K, M, O या V को छोड़कर कोई भी अक्षर हो सकता है।

शुभकामनाएँ

कॉलिन


2
शानदार जवाब, मैंने विदेशों में जोड़ा^(([gG][iI][rR] {0,}0[aA]{2})|(([aA][sS][cC][nN]|[sS][tT][hH][lL]|[tT][dD][cC][uU]|[bB][bB][nN][dD]|[bB][iI][qQ][qQ]|[fF][iI][qQ][qQ]|[pP][cC][rR][nN]|[sS][iI][qQ][qQ]|[iT][kK][cC][aA]) {0,}1[zZ]{2})|((([a-pr-uwyzA-PR-UWYZ][a-hk-yxA-HK-XY]?[0-9][0-9]?)|(([a-pr-uwyzA-PR-UWYZ][0-9][a-hjkstuwA-HJKSTUW])|([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y][0-9][abehmnprv-yABEHMNPRV-Y]))) {0,}[0-9][abd-hjlnp-uw-zABD-HJLNP-UW-Z]{2}))$
डेविड ब्रैडशॉ

असीमित, वैकल्पिक रिक्त स्थान {0,}के *लिए क्यों निर्दिष्ट करें ?
कोड एनिमल

76

मैं हाल ही में पोस्ट एक जवाब के लिए आर भाषा के लिए ब्रिटेन डाक कोड पर इस सवाल का । मुझे पता चला कि यूके सरकार का रेगेक्स पैटर्न गलत है और ठीक से विफल रहता है कुछ पोस्टकोड सत्यापित । दुर्भाग्य से, यहां कई उत्तर इस गलत पैटर्न पर आधारित हैं।

मैं इनमें से कुछ मुद्दों को नीचे रेखांकित करूँगा और एक नियमित नियमित अभिव्यक्ति प्रदान करूँगा जो वास्तव में काम करती है।


ध्यान दें

मेरा उत्तर (और सामान्य रूप से नियमित अभिव्यक्ति):

  • केवल पोस्टकोड स्वरूपों को मान्य करता है
  • यह सुनिश्चित नहीं करता है कि एक पोस्टकोड वैध रूप से मौजूद है
    • इसके लिए, एक उपयुक्त एपीआई का उपयोग करें! अधिक जानकारी के लिए बेन का जवाब देखें ।

यदि आप खराब रेगेक्स के बारे में परवाह नहीं करते हैं और केवल उत्तर को छोड़ना चाहते हैं, तो उत्तर अनुभाग पर स्क्रॉल करें ।

द बैड रेगेक्स

इस खंड में नियमित अभिव्यक्तियों का उपयोग नहीं किया जाना चाहिए।

यह विफल रीजेक्स है जिसे यूके सरकार ने डेवलपर्स प्रदान किया है (यह सुनिश्चित नहीं है कि यह लिंक कितने समय तक रहेगा, लेकिन आप इसे अपने बल्क डेटा ट्रांसफर प्रलेखन में देख सकते हैं ):

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))[0-9][A-Za-z]{2})$

समस्या

समस्या 1 - कॉपी / पेस्ट

यहाँ उपयोग में रेगेक्स देखें

जैसा कि कई डेवलपर्स संभावना रखते हैं, वे कोड / पेस्ट (विशेष रूप से नियमित अभिव्यक्ति) को कॉपी करते हैं और उन्हें काम करने की उम्मीद करते हुए पेस्ट करते हैं। हालांकि यह सिद्धांत में महान है, यह इस विशेष मामले में विफल रहता है क्योंकि इस दस्तावेज़ से कॉपी / पेस्ट करना वास्तव में पात्रों में से एक (एक स्थान) को एक नई पंक्ति में बदल देता है जैसा कि नीचे दिखाया गया है:

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))
[0-9][A-Za-z]{2})$

सबसे पहली बात जो डेवलपर्स करेंगे, वह सिर्फ दो बार सोचे बिना नई लाइन को मिटा देगा। अब रेगेक्स उनके ( GIR 0AAपोस्टकोड के अलावा) स्थानों के साथ पोस्टकोड से मेल नहीं खाएगा ।

इस समस्या को ठीक करने के लिए, नए वर्ण को स्थान वर्ण से प्रतिस्थापित किया जाना चाहिए:

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$
                                                                                                                                                     ^

समस्या 2 - सीमाएँ

यहाँ उपयोग में रेगेक्स देखें

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$
^^                     ^ ^                                                                                                                                            ^^

पोस्टकोड regex अनुचित रूप से regex को लंगर डालता है। इस रीजेक्स का उपयोग करने वाला कोई भी व्यक्ति पोस्टकोड को मान्य करने के लिए आश्चर्यचकित हो सकता है यदि मूल्य इस तरह से fooA11 1AAप्राप्त होता है। ऐसा इसलिए है क्योंकि उन्होंने पहले विकल्प की शुरुआत और दूसरे विकल्प के अंत (एक दूसरे से स्वतंत्र) की शुरुआत की है, जैसा कि ऊपर रेगेक्स में बताया गया है।

इसका मतलब यह है कि ^(लाइन की शुरुआत में स्थिति का दावा करता है) केवल पहले विकल्प पर काम करता है ([Gg][Ii][Rr] 0[Aa]{2}), इसलिए दूसरा विकल्प किसी भी तार को समाप्त कर देगा जो एक पोस्टकोड में होता है (चाहे जो पहले आए)।

इसी तरह, पहला विकल्प लाइन के अंत तक लंगर नहीं डाला जाता है $, इसलिए GIR 0AAfooइसे स्वीकार भी किया जाता है।

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))[0-9][A-Za-z]{2})$

इस समस्या को ठीक करने के लिए, दोनों विकल्पों को दूसरे समूह (या गैर-कैप्चरिंग समूह) में लपेटा जाना चाहिए और उसके आसपास रखे गए एंकर:

^(([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2}))$
^^                                                                                                                                                                      ^^

समस्या 3 - अनुचित चरित्र सेट

यहाँ उपयोग में रेगेक्स देखें

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$
                                                                                       ^^

-वर्णों की एक श्रृंखला को इंगित करने के लिए रेगेक्स यहां गायब है । जैसा कि यह खड़ा है, अगर एक पोस्टकोड प्रारूप में है ANA NAA(जहां Aएक पत्र का Nप्रतिनिधित्व करता है और एक संख्या का प्रतिनिधित्व करता है), और यह इसके अलावा Aया इसके अलावा किसी भी चीज़ से शुरू होता हैZ , यह असफल हो जायेगी।

इसका मतलब है कि यह मेल खाएगा A1A 1AAऔर Z1A 1AAनहीं, लेकिन B1A 1AA

इस समस्या को ठीक करने के लिए, चरित्र -को संबंधित वर्ण सेट में Aऔर उसके बीच रखा जाना चाहिए Z:

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$
                                                                                        ^

समस्या 4 - गलत वैकल्पिक चरित्र सेट

यहाँ उपयोग में रेगेक्स देखें

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$
                                                                                                                                        ^

मैं कसम खाता हूं कि उन्होंने वेब पर इसे सार्वजनिक करने से पहले इस चीज का परीक्षण भी नहीं किया था। उन्होंने गलत चरित्र सेट को वैकल्पिक बना दिया। उन्होंने [0-9]विकल्प 2 (समूह 9) के चौथे उप-विकल्प में विकल्प बनाया। यह रेगेक्स को गलत तरीके से फॉर्मेट किए गए पोस्टकोड की तरह मिलान करने की अनुमति देता है AAA 1AA

इस समस्या को ठीक करने के लिए, इसके बजाय अगले वर्ण वर्ग को वैकल्पिक बनाएं (और बाद में सेट [0-9]मैच को एक बार ठीक से बनाएं ):

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9][A-Za-z]?)))) [0-9][A-Za-z]{2})$
                                                                                                                                                ^

समस्या 5 - प्रदर्शन

इस रेगेक्स पर प्रदर्शन बेहद खराब है। सबसे पहले, उन्होंने GIR 0AAशुरुआत में मैच के लिए कम से कम संभावना पैटर्न विकल्प रखा । कितने उपयोगकर्ताओं की संभावना होगी यह पोस्टकोड बनाम किसी भी अन्य पिनकोड; शायद कभी नहीं? इसका मतलब है कि हर बार जब रेगेक्स का उपयोग किया जाता है, तो अगले विकल्प पर आगे बढ़ने से पहले इस विकल्प को समाप्त करना होगा। यह देखने के लिए कि प्रदर्शन कैसे प्रभावित होता है , विकल्पों (22) को फ़्लिप करने के बाद उसी रेगेक्स के विरुद्ध मूल रेगेक्स (35) के चरणों की संख्या की जाँच करें ।

प्रदर्शन के साथ दूसरा मुद्दा पूरे रेगेक्स को संरचित करने के तरीके के कारण है। यदि कोई विफल रहता है तो प्रत्येक विकल्प पर कोई बिंदु नहीं है। वर्तमान रेगेक्स को जिस तरह से संरचित किया गया है, उसे बहुत सरल बनाया जा सकता है। मैं उत्तर अनुभाग में इसके लिए एक फिक्स प्रदान करता हूं ।

समस्या 6 - रिक्त स्थान

यहाँ उपयोग में रेगेक्स देखें

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


उत्तर

1. यूके सरकार के रेगेक्स को ठीक करना

समस्या अनुभाग में उल्लिखित सभी मुद्दों को ठीक करने और पैटर्न को सरल बनाने से निम्नलिखित, छोटे, अधिक संक्षिप्त पैटर्न मिलते हैं। हम अधिकांश समूहों को हटा सकते हैं क्योंकि हम पोस्टकोड को संपूर्ण रूप से सत्यापित कर रहे हैं (व्यक्तिगत भागों को नहीं):

यहाँ उपयोग में रेगेक्स देखें

^([A-Za-z][A-Ha-hJ-Yj-y]?[0-9][A-Za-z0-9]? ?[0-9][A-Za-z]{2}|[Gg][Ii][Rr] ?0[Aa]{2})$

किसी एक मामले (ऊपरी या निचले मामले) से सभी सीमाओं को हटाकर और केस-असंवेदनशील ध्वज का उपयोग करके इसे और छोटा किया जा सकता है। नोट : कुछ भाषाओं में एक नहीं है, इसलिए उपरोक्त एक का उपयोग करें। प्रत्येक भाषा केस-इंसिडेंसिटी फ्लैग को अलग तरीके से लागू करती है।

यहाँ उपयोग में रेगेक्स देखें

^([A-Z][A-HJ-Y]?[0-9][A-Z0-9]? ?[0-9][A-Z]{2}|GIR ?0A{2})$

शॉर्टर फिर से बदल रहा [0-9]है \d(यदि आपका रेगेक्स इंजन इसका समर्थन करता है):

यहाँ उपयोग में रेगेक्स देखें

^([A-Z][A-HJ-Y]?\d[A-Z\d]? ?\d[A-Z]{2}|GIR ?0A{2})$

2. सरलीकृत पैटर्न

विशिष्ट वर्णमाला वर्णों को सुनिश्चित किए बिना, निम्नलिखित का उपयोग किया जा सकता है ( 1 से सरलीकरण को ध्यान में रखें । यूके सरकार के रेक्स को ठीक करना भी यहां लागू किया गया है):

यहाँ उपयोग में रेगेक्स देखें

^([A-Z]{1,2}\d[A-Z\d]? ?\d[A-Z]{2}|GIR ?0A{2})$

और आगे भी अगर आप विशेष मामले की परवाह नहीं करते हैं GIR 0AA:

^[A-Z]{1,2}\d[A-Z\d]? ?\d[A-Z]{2}$

3. जटिल पैटर्न

मैं पोस्टकोड के सत्यापन की सलाह नहीं दूंगा क्योंकि नए क्षेत्र, जिले और उप-जिले किसी भी समय दिखाई दे सकते हैं। मैं संभावित रूप से क्या करने का सुझाव दूंगा , किनारे-मामलों के लिए समर्थन जोड़ा गया है। कुछ विशेष मामले मौजूद हैं और इस विकिपीडिया लेख में उल्लिखित हैं ।

यहां जटिल रीगेक्स हैं जिनमें 3. (3.1, 3.2, 3.3) के उपसमूह शामिल हैं ।

पैटर्न के संबंध में 1. ब्रिटेन सरकार के सुधार को ठीक करना :

यहाँ उपयोग में रेगेक्स देखें

^(([A-Z][A-HJ-Y]?\d[A-Z\d]?|ASCN|STHL|TDCU|BBND|[BFS]IQQ|PCRN|TKCA) ?\d[A-Z]{2}|BFPO ?\d{1,4}|(KY\d|MSR|VG|AI)[ -]?\d{4}|[A-Z]{2} ?\d{2}|GE ?CX|GIR ?0A{2}|SAN ?TA1)$

और 2. सरलीकृत पैटर्न के संबंध में :

यहाँ उपयोग में रेगेक्स देखें

^(([A-Z]{1,2}\d[A-Z\d]?|ASCN|STHL|TDCU|BBND|[BFS]IQQ|PCRN|TKCA) ?\d[A-Z]{2}|BFPO ?\d{1,4}|(KY\d|MSR|VG|AI)[ -]?\d{4}|[A-Z]{2} ?\d{2}|GE ?CX|GIR ?0A{2}|SAN ?TA1)$

3.1 ब्रिटिश प्रवासी क्षेत्र

विकिपीडिया लेख वर्तमान में बताता है (कुछ प्रारूप थोड़े सरल हैं):

  • AI-1111: अंगुइला
  • ASCN 1ZZ: आरोही द्वीप
  • STHL 1ZZ: संत हेलेना
  • TDCU 1ZZ: ट्रिस्टन दा कुन्हा
  • BBND 1ZZ: ब्रिटेन और भारतीय समुद्री क्षेत्र
  • BIQQ 1ZZ: ब्रिटिश अंटार्कटिक क्षेत्र
  • FIQQ 1ZZ: फ़ॉकलैंड आइलैंड
  • GX11 1ZZ: जिब्राल्टर
  • PCRN 1ZZ: पिटकेर्न द्वीप
  • SIQQ 1ZZ: दक्षिण जॉर्जिया और दक्षिण सैंडविच द्वीप समूह
  • TKCA 1ZZ: तुर्क्स और कैकोज़ द्वीपसमूह
  • BFPO 11: अकरोटिरी और ढेकेलिया
  • ZZ 11और GE CX: बरमूडा ( इस दस्तावेज़ के अनुसार )
  • KY1-1111: केमैन द्वीप ( इस दस्तावेज़ के अनुसार )
  • VG1111: ब्रिटिश वर्जिन आइलैंड्स ( इस दस्तावेज़ के अनुसार )
  • MSR 1111: मोंटसेराट ( इस दस्तावेज़ के अनुसार )

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

यहाँ उपयोग में रेगेक्स देखें

^((ASCN|STHL|TDCU|BBND|[BFS]IQQ|GX\d{2}|PCRN|TKCA) ?\d[A-Z]{2}|(KY\d|MSR|VG|AI)[ -]?\d{4}|(BFPO|[A-Z]{2}) ?\d{2}|GE ?CX)$

3.2 ब्रिटिश फोर्सेज पोस्ट ऑफिस

हालाँकि, उन्हें हाल ही में ब्रिटिश पोस्टकोड प्रणाली के साथ बेहतर संरेखित करने के लिए इसे बदल दिया गया है BF#(जहां #एक संख्या का प्रतिनिधित्व करता है), उन्हें वैकल्पिक वैकल्पिक पोस्टकोड माना जाता है । ये पोस्टकोड BFPO1-4 अंकों के बाद (के) प्रारूप का अनुसरण करते हैं:

यहाँ उपयोग में रेगेक्स देखें

^BFPO ?\d{1,4}$

३.३ संता?

सांता के साथ एक और विशेष मामला है (जैसा कि अन्य उत्तरों में उल्लेख किया गया है): SAN TA1एक वैध पोस्टकोड है। इस के लिए एक regex बहुत सरल है:

^SAN ?TA1$

4
सरलीकृत पैटर्न का उपयोग करने के लिए एक बहुत अच्छा विकल्प है। मुझे लगता है कि रेगेक्स के साथ बहुत अधिक प्रतिबंधात्मक नहीं होना सबसे अच्छा है क्योंकि आपको यह सुनिश्चित करने की आवश्यकता है कि यह किसी भी बदलाव के साथ अपडेट किया गया है या आपके पास बहुत नाराज उपयोगकर्ता हो सकते हैं। मुझे स्पष्ट त्रुटियों के निराकरण के लिए एक सरलीकृत regex के साथ शिथिल रूप से मेल खाना बेहतर लगता है और फिर वैधता की पुष्टि करने के लिए आगे की जांच जैसे कि एक ईमेल पता (या ईमेल regex के मामले में पुष्टिकरण ईमेल) को लागू करना चाहिए।
जेम्स कोयल

2
उत्कृष्ट और गहन विश्लेषण।
स्टीव

1
इतने सारे स्तरों पर शानदार जवाब। अंततः, मैं आपके 2 सरलीकृत पैटर्न के साथ गया। जैसा कि मेरे पास वास्तव में सभी यूके पोस्टकोड के साथ एक डीबी है, मुझे सिर्फ यह देखने के लिए पहली पास की आवश्यकता है कि क्या पता स्ट्रिंग संभावित रूप से एक वैध पोस्टकोड है, इसलिए मुझे झूठी सकारात्मक के बारे में परवाह नहीं है (जैसा कि वास्तविक लुकअप उन्हें जड़ देगा) , लेकिन मैं झूठे नकारात्मक की परवाह करता हूं। और गति भी मायने रखती है।
जॉन पॉवेल

यूके के पोस्टकोड सिस्टम के साथ बहुत सारे मुद्दे हैं, जो कि कंप्यूटर युग से पहले समिति द्वारा बनाए गए हैं, लेकिन चर लंबाई और रिक्त स्थान का मुद्दा सबसे खतरनाक में से एक है। मैंने भयावहता के सभी तरीकों को देखा है, जिसमें E1 5JX से E1 5JX जैसे तीन पोस्टिंग के साथ पैडिंग पोस्टकोड शामिल हैं, ताकि यह एक्सेल में SW18 5HA के साथ अच्छी तरह से संरेखित हो (प्रबंधन पते के लिए पसंद का छिपा हुआ अनुचित सॉफ़्टवेयर डालें)। एकमात्र सॉल्यूशन, आईएमएचओ, सभी रिक्त स्थान को अलग करना है, ताकि पोस्टकोड एक एकल स्ट्रिंग हो, इससे पहले कि वह इलास्टिक, सोलर, पोस्टग्रैस, आदि के पास कहीं भी हो जाए
जॉन पॉवेल

45

एक व्यापक यूके पोस्टकोड नियमित अभिव्यक्ति के रूप में ऐसी कोई चीज नहीं है जो पोस्टकोड को मान्य करने में सक्षम है । आप देख सकते हैं कि एक पोस्टकोड एक नियमित अभिव्यक्ति का उपयोग करके सही प्रारूप में है; ऐसा नहीं है कि यह वास्तव में मौजूद है।

पोस्टकोड मनमाने ढंग से जटिल और लगातार बदलते रहते हैं। उदाहरण के लिए, आउटकोड W1प्रत्येक पोस्टकोड क्षेत्र के लिए 1 और 99 के बीच प्रत्येक संख्या नहीं है, और कभी नहीं हो सकता है।

आप उम्मीद नहीं कर सकते कि वर्तमान में क्या हमेशा के लिए सच है। एक उदाहरण के रूप में, 1990 में, पोस्ट ऑफिस ने फैसला किया कि एबरडीन में थोड़ी भीड़ हो रही थी। उन्होंने AB1-5 के अंत में 0 जोड़कर इसे AB10-50 बना दिया और फिर इन दोनों के बीच कई पोस्टकोड बनाए।

जब भी कोई नई सड़क बनती है तो एक नया पोस्टकोड बनाया जाता है। यह निर्माण की अनुमति प्राप्त करने के लिए प्रक्रिया का हिस्सा है; स्थानीय अधिकारी इसे पोस्ट ऑफिस के साथ अद्यतन रखने के लिए बाध्य हैं (ऐसा नहीं है कि वे सभी करते हैं)।

इसके अलावा, जैसा कि कई अन्य उपयोगकर्ताओं द्वारा नोट किया गया है, वहाँ विशेष पोस्टकोड जैसे Girobank, GIR 0AA, और सांता के लिए पत्रों के लिए एक है, सैन TA1 - आप शायद वहाँ कुछ भी पोस्ट नहीं करना चाहते हैं लेकिन यह दिखाई नहीं देता है किसी अन्य उत्तर से आच्छादित होना।

फिर, बीएफपीओ पोस्टकोड हैं, जो अब अधिक मानक प्रारूप में बदल रहे हैं । दोनों प्रारूप मान्य होने जा रहे हैं। अन्त में, विदेशी क्षेत्र का स्रोत विकिपीडिया है

+ ---------- + -------------------------------------- -------- +
| पोस्टकोड | स्थान |
+ ---------- + -------------------------------------- -------- +
| एआई -2640 | अंगुइला |
| ASCN 1ZZ | उदगम द्वीप |
| STHL 1ZZ | संत हेलेना |
| TDCU 1ZZ | त्रिस्टान दा कुन्हा |
| BBND 1ZZ | ब्रिटिश हिंद महासागर क्षेत्र |
| BIQQ 1ZZ | ब्रिटिश अंटार्कटिक क्षेत्र |
| FIQQ 1ZZ | फ़ॉकलैंड द्वीप |
| GX11 1AA | जिब्राल्टर |
| PCRN 1ZZ | पिटकेर्न द्वीप |
| SIQQ 1ZZ | दक्षिण जॉर्जिया और दक्षिण सैंडविच द्वीप समूह |
| TKCA 1ZZ | तुर्क और कैकोस द्वीप |
+ ---------- + -------------------------------------- -------- +

इसके बाद, आपको यह ध्यान रखना होगा कि यूके दुनिया में कई जगहों पर अपने पोस्टकोड सिस्टम को "निर्यात" करता है। जो कुछ भी "यूके" पोस्टकोड को मान्य करता है, वह कई अन्य देशों के पोस्टकोड को भी मान्य करेगा।

यदि आप यूके के पोस्टकोड को सबसे सुरक्षित तरीके से सत्यापित करना चाहते हैं, तो यह है कि वर्तमान पोस्टकोड के लुक-अप का उपयोग करें। कई विकल्प हैं:

  • आयुध सर्वेक्षण एक खुले डेटा लाइसेंस के तहत कोड-पॉइंट ओपन जारी करता है। यह बहुत कम समय के पीछे होगा लेकिन यह मुफ़्त है। यह (शायद - मुझे याद नहीं है) उत्तरी आयरिश डेटा को शामिल नहीं किया जा सकता है क्योंकि ऑर्डनेंस सर्वेक्षण में कोई रीमिट नहीं है। उत्तरी आयरलैंड में मैपिंग उत्तरी आयरलैंड के आयुध सर्वेक्षण द्वारा किया जाता है और उनके पास अपने, अलग, पेड-फॉर, पॉइंटर उत्पाद होते हैं। आप इसका उपयोग कर सकते हैं और कुछ को जोड़ सकते हैं जो आसानी से कवर नहीं होते हैं।

  • रॉयल मेल पोस्टकोड एड्रेस फाइल (पीएएफ) जारी करता है , इसमें बीएफपीओ शामिल है जो मुझे यकीन नहीं है कि कोड-प्वाइंट ओपन करता है। यह नियमित रूप से अपडेट किया जाता है, लेकिन पैसे खर्च होते हैं (और वे इसके बारे में कभी-कभी नकारात्मक हो सकते हैं)। पीएएफ में सिर्फ पोस्टकोड के बजाय पूरा पता शामिल है और यह अपने स्वयं के प्रोग्रामर गाइड के साथ आता है । ओपन डेटा यूजर ग्रुप (ODUG) वर्तमान में पीएएफ को मुफ्त में जारी करने की पैरवी कर रहा है, यहां उनकी स्थिति का वर्णन है

  • अन्त में, एड्रेसबेस है । यह ऑर्डनेंस सर्वेक्षण, स्थानीय प्राधिकरणों, रॉयल मेल और एक मेल कंपनी के बीच सभी यूके पतों के बारे में सभी जानकारी की एक निश्चित निर्देशिका बनाने के लिए एक सहयोग है (वे काफी सफल रहे हैं)। यह भुगतान किया जाता है, लेकिन यदि आप किसी स्थानीय प्राधिकरण, सरकारी विभाग, या सरकारी सेवा के साथ काम कर रहे हैं तो यह उनके लिए मुफ्त है। वहाँ सिर्फ पोस्टकोड शामिल की तुलना में बहुत अधिक जानकारी है।


दिलचस्प लग रहा है
SuperUberDuper

2
हालांकि इसका जवाब यह नहीं है कि ऑप की तलाश थी, यह शायद सबसे उपयोगी है। यह मुझे उन नियमों को शिथिल करने के लिए प्रोत्साहित करेगा जो मैं करने जा रहा हूँ।
जॉन हंट

22

मुझे ऊपर दिए गए कुछ उत्तरों पर एक नज़र थी और मैं @ Dan के उत्तर (c। 15 दिसंबर 10) से पैटर्न का उपयोग करने के खिलाफ सिफारिश करूंगा , क्योंकि यह गलत तरीके से वैध पोस्टकोड के लगभग 0.4% झंडे को अमान्य मानता है, जबकि अन्य नहीं करते हैं। ।

आयुध सर्वेक्षण सेवा प्रदान करता है जिसे कोड प्वाइंट ओपन कहा जाता है:

ग्रेट ब्रिटेन में सभी वर्तमान पोस्टकोड इकाइयों की एक सूची है

मैंने इस डेटा का उपयोग करके पोस्टकोड्स (जुलाई 6 '13) की पूरी सूची के खिलाफ उपरोक्त प्रत्येक रेगेक्स को चलाया grep:

cat CSV/*.csv |
    # Strip leading quotes
    sed -e 's/^"//g' |
    # Strip trailing quote and everything after it
    sed -e 's/".*//g' |
    # Strip any spaces
    sed -E -e 's/ +//g' |
    # Find any lines that do not match the expression
    grep --invert-match --perl-regexp "$pattern"

कुल 1,686,202 पोस्टकोड हैं।

निम्नलिखित मान्य पोस्टकोड की संख्या है जो प्रत्येक से मेल नहीं खाती $pattern:

'^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]?[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)$'
# => 6016 (0.36%)
'^(GIR ?0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]([0-9ABEHMNPRV-Y])?)|[0-9][A-HJKPS-UW]) ?[0-9][ABD-HJLNP-UW-Z]{2})$'
# => 0
'^GIR[ ]?0AA|((AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|BX|CA|CB|CF|CH|CM|CO|CR|CT|CV|CW|DA|DD|DE|DG|DH|DL|DN|DT|DY|E|EC|EH|EN|EX|FK|FY|G|GL|GY|GU|HA|HD|HG|HP|HR|HS|HU|HX|IG|IM|IP|IV|JE|KA|KT|KW|KY|L|LA|LD|LE|LL|LN|LS|LU|M|ME|MK|ML|N|NE|NG|NN|NP|NR|NW|OL|OX|PA|PE|PH|PL|PO|PR|RG|RH|RM|S|SA|SE|SG|SK|SL|SM|SN|SO|SP|SR|SS|ST|SW|SY|TA|TD|TF|TN|TQ|TR|TS|TW|UB|W|WA|WC|WD|WF|WN|WR|WS|WV|YO|ZE)(\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}))|BFPO[ ]?\d{1,4}$'
# => 0

बेशक, ये परिणाम केवल वैध पोस्टकोड से निपटते हैं जो गलत रूप से अमान्य के रूप में चिह्नित किए जाते हैं। इसलिए:

'^.*$'
# => 0

मैं कुछ भी नहीं कह रहा हूं कि अवैध पोस्टकोड को फ़िल्टर करने के बारे में कौन सा पैटर्न सबसे अच्छा है।


1
क्या यह नहीं है कि मैं अपने उत्तर में क्या कहता हूं और यदि आप अव्यवस्थित मार्ग से नीचे जा रहे हैं, तो शायद आपको उन सभी को करना चाहिए, और यदि कोई व्यक्ति अपना उत्तर बदलता है तो उसे अपडेट रखें? यदि नहीं, तो कम से कम आपके द्वारा लिए गए उत्तर के अंतिम संपादन की तारीख का संदर्भ दें ताकि लोग यह देख सकें कि क्या यह तब से बदल दिया गया है।
बेन

निष्पक्ष बिंदु। तदनुसार संपादित किया गया। मुझे लगता है कि यह चर्चा के लिए जोड़ता है कि इनमें से अधिकांश पैटर्न सीपीओ कोडों में से किसी को भी बाहर नहीं करते हैं, लेकिन यह सबसे अधिक (मान्य रेगेक्स) उत्तर देता है। भविष्य के पाठक: ध्यान रखें कि मेरे परिणाम पुराने होने की संभावना है।
रिचर्ड्स जूल 10'13

17
^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]? {1,2}[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)$

वैध यूके पोस्टकोड से मिलान करने के लिए नियमित अभिव्यक्ति। यूके की डाक प्रणाली में सभी पत्रों का उपयोग सभी पदों (वाहन पंजीकरण प्लेटों के साथ ही) में किया जाता है और इसे नियंत्रित करने के लिए विभिन्न नियम हैं। यह रेगेक्स उन नियमों को ध्यान में रखता है। नियमों का विवरण: पोस्टकोड मान्य प्रारूप के पहले आधे भाग [AZ] [AZ] [0-9] [AZ] [AZ] [AZ] [0-9] [0-9] [AZ] [0-9] [ 0-9] [AZ] [AZ] [0-9] [AZ] [AZ] [AZ] [० ९] [0-9] [AZ] [AZ] [0-9] अपवाद स्थिति - पहला। नियंत्रण - QVX ने स्थिति का उपयोग नहीं किया - दूसरा। कॉन्ट्रिंट - IJZ का उपयोग GIR 0AA स्थिति को छोड़कर नहीं किया गया - तीसरा। बाधा - AEHMNPRTVXY केवल स्थिति - फोर्थ का उपयोग करता है। कॉन्ट्रिंट - ABEHMNPRVWXY पोस्टकोड मान्य प्रारूप का दूसरा आधा भाग [0-9] [AZ] [AZ] अपवाद स्थिति - दूसरा और तीसरा। नियंत्रण - CIKMOV का उपयोग नहीं किया गया

http://regexlib.com/REDetails.aspx?regexp_id=260


1
पता नहीं क्यों लोगों ने इस जवाब को गलत ठहराया है
ओली

जावास्क्रिप्ट में पोस्टल कोड "YO31" और "YO31 1" के लिए रेगेक्स काम नहीं करता है।
प्रतिक खड़लोय

9
मुझे नहीं लगता कि यह सही है, क्योंकि रेगेक्स ने विवरण का विरोधाभास दिया है, और सुझाव दिया है कि आप पोस्टकोड को शुरू कर सकते हैं 0-9, जो आप नहीं कर सकते हैं
लुइगी प्लिंज

4
यह रेगेक्स लगभग 6000 वैध पोस्टकोड पर विफल रहता है, इसलिए मैं इसके खिलाफ सुझाऊंगा। मेरा जवाब देखिए ।
रिचर्ड्स जूल 6'13

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

14

इस विकिपीडिया तालिका के अनुसार

यहां छवि विवरण दर्ज करें

यह पैटर्न सभी मामलों को कवर करता है

(?:[A-Za-z]\d ?\d[A-Za-z]{2})|(?:[A-Za-z][A-Za-z\d]\d ?\d[A-Za-z]{2})|(?:[A-Za-z]{2}\d{2} ?\d[A-Za-z]{2})|(?:[A-Za-z]\d[A-Za-z] ?\d[A-Za-z]{2})|(?:[A-Za-z]{2}\d[A-Za-z] ?\d[A-Za-z]{2})

Android \ Java पर इसका उपयोग करते समय \\ d \ _ का उपयोग करें


मुझे यह सबसे पठनीय उत्तर मिला, हालाँकि यह केवल gov.uk वेबसाइट से जानकारी लेने वाले समाधानों के अनुसार वास्तविक वैध कोड के बजाय पोस्टकोड के रूप में दिखता है, लेकिन यह मेरे उपयोग के मामले के लिए पर्याप्त है। इसके साथ थोड़ा खेलने के बाद (अजगर में), मैंने इसे थोड़ा अधिक कॉम्पैक्ट लेकिन समकक्ष रेगेक्स के रूप में बताया, जो एक वैकल्पिक स्थान के लिए भी अनुमति देता है: ([a-zA-Z] (?: ?: (?: [a-zA) Z] \ घ [a-zA-Z]) | (: \ घ {1,2}) | (?? [a-zA-Z] \ घ {1,2})) \ डब्ल्यू [0 -9] [a-zA-Z] {2})
रिचर्ड जे।

14

यहां अधिकांश उत्तर मेरे डेटाबेस में मौजूद सभी पोस्टकोड के लिए काम नहीं करते थे। मुझे अंत में एक ऐसा मिला जो सरकार द्वारा प्रदान किए गए नए रेगेक्स का उपयोग करते हुए सभी के साथ मान्य होता है:

https://www.gov.uk/government/uploads/system/uploads/attachment_data/file/413338/Bulk_Data_Transfer_-_additional_validation_valid_from_March_2015.pdf

यह पिछले जवाबों में से किसी में नहीं है इसलिए मैं इसे नीचे पोस्ट करने के मामले में यहाँ पोस्ट करता हूँ:

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$

अद्यतन: जेमी बैल द्वारा इंगित के रूप में अद्यतन regex। यकीन नहीं होता कि यह मेरी कॉपी करने में त्रुटि थी या यह सरकार के रेक्सक्स में त्रुटि थी, लिंक अब नीचे है ...

अद्यतन: ctwheels के रूप में, इस regex जावास्क्रिप्ट regex स्वाद के साथ काम करता है। पीसीआर (php) फ्लेवर के साथ काम करने वाले के लिए उसकी टिप्पणी देखें।


1
^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$होना चाहिए ^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$- अंतर हाजिर ;-)
जेमी बुल

1
सटीक! मेरे उत्तर को अपडेट किया। धन्यवाद!
जेसुअस करेरा

2
यह यहाँ एकमात्र उत्तर है जिसने regexr.com और नोटपैड ++ में काम किया है । हालाँकि, मैंने इसे regexr.com के लिए एक से अधिक परिणाम खोजने और दोनों के लिए एक परिणाम को खोजने के लिए ([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) ?[0-9][A-Za-z]{2})(स्थान को हटा दिया ^और $जोड़ा गया ?) के बाद बदल दिया था, जिसके लिए एक स्थान सेपरेटर नहीं है।
मिथोफैक्लोन

@ctwheels यह रेगेक्स जावास्क्रिप्ट स्वाद के लिए है। यदि आपके असफल लिंक में आप जावास्क्रिप्ट का चयन करते हैं तो यह काम करेगा। यह एक शानदार कैच है और मैं अपना जवाब अपडेट करूंगा।
जेसुज करेरा

1
दस्तावेज़ीकरण में पोस्ट किया गया regex स्वाभाविक रूप से गलत है। पूरी अभिव्यक्ति को एक गैर-कैप्चरिंग समूह में लपेटा जाना चाहिए (?:)और फिर उसके चारों ओर लंगर डाले जाने चाहिए। इसे यहां विफल देखें । अधिक जानकारी के लिए, मेरा जवाब यहां देखें^(?:([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2}))$सही नियमित अभिव्यक्ति है।
ctwheels

12

एक पुराना पोस्ट, लेकिन फिर भी Google परिणामों में बहुत अधिक है तो सोचा कि मैं अपडेट करूंगा। इस अक्टूबर 14 डॉक्टर ने यूके के पोस्टकोड की नियमित अभिव्यक्ति को परिभाषित किया है:

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([**AZ**a-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$

से:

https://www.gov.uk/government/uploads/system/uploads/attachment_data/file/359448/4__Bulk_Data_Transfer_-_additional_validation_valid.pdf

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

^(GIR 0AA)|((([A-Z][0-9]{1,2})|(([A-Z][A-HJ-Y][0-9]{1,2})|(([A-Z][0-9][A-Z])|([A-Z][A-HJ-Y][0-9]?[A-Z])))) [0-9][A-Z]{2})$

यह नए लंदन पोस्टकोड (जैसे W1D 5LH) के साथ काम करता है जो पिछले संस्करणों में नहीं था।


ऐसा लगता है कि बोल्ड में हाइलाइट की गई त्रुटि दस्तावेज़ में तय की गई है, लेकिन मैं अभी भी आपकी नियमित अभिव्यक्ति पसंद करता हूं क्योंकि यह पढ़ना आसान है।
प्रोग्रामिंग के प्रोफेसर

5
केवल एक चीज जो मैं कहूंगा कि अंतरिक्ष को \ _ में बदलकर स्थान को वैकल्पिक बनाया जाए? अंतरिक्ष के रूप में पठनीयता के लिए यह एक आवश्यकता नहीं है।
प्रोग्रामिंग

दस्तावेज़ीकरण में पोस्ट किया गया regex स्वाभाविक रूप से गलत है। पूरी अभिव्यक्ति को एक गैर-कैप्चरिंग समूह में लपेटा जाना चाहिए (?:)और फिर उसके चारों ओर लंगर डाले जाने चाहिए। इसे यहां विफल देखें । अधिक जानकारी के लिए, मेरा जवाब यहां देखें^(?:([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2}))$सही नियमित अभिव्यक्ति है।
ctwheels

10

यह regex Google उनके i18napis.appspot.com डोमेन पर कार्य करता है :

GIR[ ]?0AA|((AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|BX|CA|CB|CF|CH|CM|CO|CR|CT|CV|CW|DA|DD|DE|DG|DH|DL|DN|DT|DY|E|EC|EH|EN|EX|FK|FY|G|GL|GY|GU|HA|HD|HG|HP|HR|HS|HU|HX|IG|IM|IP|IV|JE|KA|KT|KW|KY|L|LA|LD|LE|LL|LN|LS|LU|M|ME|MK|ML|N|NE|NG|NN|NP|NR|NW|OL|OX|PA|PE|PH|PL|PO|PR|RG|RH|RM|S|SA|SE|SG|SK|SL|SM|SN|SO|SP|SR|SS|ST|SW|SY|TA|TD|TF|TN|TQ|TR|TS|TW|UB|W|WA|WC|WD|WF|WN|WR|WS|WV|YO|ZE)(\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}))|BFPO[ ]?\d{1,4}

10

पोस्टकोड परिवर्तन के अधीन हैं, और पोस्टकोड को सत्यापित करने का एकमात्र सही तरीका पोस्टकोड की पूरी सूची है और देखें कि क्या यह है।

लेकिन नियमित अभिव्यक्ति उपयोगी है क्योंकि वे:

  • उपयोग और कार्यान्वयन के लिए आसान है
  • छोटी है
  • दौड़ने में तेज हैं
  • बनाए रखने के लिए काफी आसान है (पोस्टकोड की पूरी सूची की तुलना में)
  • अभी भी अधिकांश इनपुट त्रुटियों को पकड़ते हैं

लेकिन नियमित अभिव्यक्तियों को बनाए रखना मुश्किल होता है, खासकर किसी ऐसे व्यक्ति के लिए जो पहली बार में इसके साथ नहीं आया था। तो यह होना चाहिए:

  • जितना संभव हो उतना आसान समझना
  • अपेक्षाकृत भविष्य का प्रमाण

इसका मतलब है कि इस उत्तर में अधिकांश नियमित अभिव्यक्तियाँ पर्याप्त नहीं हैं। उदाहरण के लिए, मैं देख सकता हूं कि [A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRV-Y]फॉर्म AA1A के पोस्टकोड क्षेत्र से मेल खाने वाला है - लेकिन यह गर्दन में दर्द होने वाला है, अगर और जब एक नया पोस्टकोड क्षेत्र जोड़ा जाता है, क्योंकि यह समझना मुश्किल है कि यह कौन से पोस्टकोड क्षेत्रों से मेल खाता है।

मैं यह भी चाहता हूं कि मेरी नियमित अभिव्यक्ति पोस्टकोड के पहले और दूसरे छमाही को कोष्ठक के रूप में मिलान करें।

तो मैं इसके साथ आया हूँ:

(GIR(?=\s*0AA)|(?:[BEGLMNSW]|[A-Z]{2})[0-9](?:[0-9]|(?<=N1|E1|SE1|SW1|W1|NW1|EC[0-9]|WC[0-9])[A-HJ-NP-Z])?)\s*([0-9][ABD-HJLNP-UW-Z]{2})

पीसीआरई प्रारूप में इसे इस प्रकार लिखा जा सकता है:

/^
  ( GIR(?=\s*0AA) # Match the special postcode "GIR 0AA"
    |
    (?:
      [BEGLMNSW] | # There are 8 single-letter postcode areas
      [A-Z]{2}     # All other postcode areas have two letters
      )
    [0-9] # There is always at least one number after the postcode area
    (?:
      [0-9] # And an optional extra number
      |
      # Only certain postcode areas can have an extra letter after the number
      (?<=N1|E1|SE1|SW1|W1|NW1|EC[0-9]|WC[0-9])
      [A-HJ-NP-Z] # Possible letters here may change, but [IO] will never be used
      )?
    )
  \s*
  ([0-9][ABD-HJLNP-UW-Z]{2}) # The last two letters cannot be [CIKMOV]
$/x

मेरे लिए यह यथासंभव सही होने के बीच सही संतुलन है, जबकि एक ही समय में भविष्य के प्रमाण और आसान रखरखाव की अनुमति है।


निश्चित नहीं है कि आपको वोट क्यों दिया गया - यह सभी वैध पोस्टकोड के साथ काम करता है जो मैंने इसे फेंक दिया है और रिक्त स्थान जो कि ऊपर दिए गए बहुत सारे उत्तर सही तरीके से नहीं संभालते हैं। क्या किसी को यह समझाने की परवाह होगी कि क्यों?
जॉन

1
@Jon यह तब भी मेल खाता है जब अन्य वर्णों को प्रारंभ या अंत में जोड़ा जाता है जैसे aSW1A 1AAasfgमेरे लिए मिलान किया गया है (मैं नीचे नहीं आया, हालांकि ऐसा लगता है कि यह आसानी से तय किया जा सकता है)
घटाता है।

9

मैं पिछले दिन या तो ब्रिटेन पोस्टकोड regex के लिए देख रहा हूँ और इस धागे पर ठोकर खाई। मैंने ऊपर दिए गए अधिकांश सुझावों के माध्यम से अपना काम किया और उनमें से किसी ने भी मेरे लिए काम नहीं किया, इसलिए मैं अपने स्वयं के rexx के साथ आया, जहां तक ​​मुझे पता है, सभी मान्य यूके पोस्टकोड्स को जन '13 (नवीनतम साहित्य के अनुसार) से पकड़ते हैं द रॉयल मेल)।

Regex और PHP कोड की जाँच करने वाले कुछ सरल पोस्टकोड नीचे पोस्ट किए गए हैं। नोट: - यह लोअर या अपरकेस पोस्टकोड और GIR 0AA विसंगति के लिए अनुमति देता है, लेकिन संभावना से अधिक से निपटने के लिए, एक दर्ज पोस्टकोड के बीच में एक स्थान की उपस्थिति यह भी परीक्षण से पहले अंतरिक्ष को दूर करने के लिए एक सरल str_replace का उपयोग करता है रेगेक्स के खिलाफ। उससे आगे और रॉयल मेल की कोई भी विसंगतियाँ उनके साहित्य में भी नहीं दिखतीं (देखें http://www.royalmail.com/sites/default/files/docs/pdf/programmers_guide_edition_7_v5.pdf और पृष्ठ 17 से पढ़ना शुरू करें) !

नोट: रॉयल मेल के स्वयं के साहित्य (ऊपर लिंक) में तीसरे और चौथे स्थान के आस-पास थोड़ी अस्पष्टता है और इन वर्णों के अक्षर होने पर अपवाद हैं। मैंने इसे स्पष्ट करने के लिए सीधे रॉयल मेल से संपर्क किया और अपने स्वयं के शब्दों में "AAR NAA के प्रारूप के साथ आउटवर्ड कोड की चौथी स्थिति में एक अक्षर का कोई अपवाद नहीं है और 3rd स्थिति अपवाद केवल आउटवर्ड कोड के अंतिम अक्षर पर लागू होते हैं प्रारूप ANA NAA। " सीधे घोड़े के मुंह से!

<?php

    $postcoderegex = '/^([g][i][r][0][a][a])$|^((([a-pr-uwyz]{1}([0]|[1-9]\d?))|([a-pr-uwyz]{1}[a-hk-y]{1}([0]|[1-9]\d?))|([a-pr-uwyz]{1}[1-9][a-hjkps-uw]{1})|([a-pr-uwyz]{1}[a-hk-y]{1}[1-9][a-z]{1}))(\d[abd-hjlnp-uw-z]{2})?)$/i';

    $postcode2check = str_replace(' ','',$postcode2check);

    if (preg_match($postcoderegex, $postcode2check)) {

        echo "$postcode2check is a valid postcode<br>";

    } else {

        echo "$postcode2check is not a valid postcode<br>";

    }

?>

मुझे आशा है कि यह किसी और की मदद करता है जो इस समाधान की तलाश में आता है।


1
मुझे यह जानने की उत्सुकता होगी कि कौन से उदाहरण पोस्टकोड प्रकाशित किए गए थे?
ज़ाफ - बेन डुगुइद

मैं आपको एक विशिष्ट पोस्टकोड (पूर्ण पीएएफ सूची तक पहुंच के बिना) नहीं दे सकता हूं, लेकिन प्रारूप एएनए एनएए के साथ पोस्टकोड संभवत: विफल हो जाएंगे क्योंकि पी और क्यू को 3 जी स्थिति में अनुमति दी जाती है और प्रारूप के साथ पोस्टकोड एनएएएएए संभावित रूप से होगा। 4 वीं स्थिति भी विफल हो जाती है क्योंकि सभी पत्र (ऊपर दिए गए स्वीकृत उत्तर में दिए गए regex इन दोनों में से किसी का भी हिसाब नहीं देते हैं)। जैसा कि मैं कहता हूं कि मैं केवल रॉयल मेल की वर्तमान सलाह से जा रहा हूं - ऊपर दिए गए उत्तर के समय, हो सकता है कि रेगेक्स पूरी तरह से अनिवार्य था।
डैन सोलो

सिर के लिए धन्यवाद - मैं देख सकता हूं कि "पी" को तीसरी स्थिति में (आपके लिंक किए गए डॉक्टर से) स्वीकार्य माना गया है, लेकिन क्यू नहीं - लेकिन आप कहां पढ़ रहे हैं कि "4 वीं स्थिति सभी पत्रों को अनुमति देती है"? डॉक्टर ने "आगे की स्थिति" का उल्लेख बिल्कुल भी नहीं किया है जहाँ तक मैं देख सकता हूँ, इसलिए मैं इसे "वास्तविक स्थिति की परवाह किए बिना तीसरे अक्षर" के रूप में पढ़ूँगा।
ज़ाफ - बेन डुगिड

1
अभी रॉयल मेल सपोर्ट टीम से शब्द वापस आया था और नियमों की मेरी व्याख्या स्पष्ट रूप से सही है। आउटवर्ड कोड (जैसे AANA NAA) की 4 वीं स्थिति में एक अक्षर का कोई अपवाद नहीं है और तीसरा स्थान अपवाद केवल अंतिम अक्षर (जैसे ANA NAA) पर लागू होता है। सीधे घोड़े के मुंह से।
डैन सोलो

1
@DanSolo इस regex एक वैध पोस्टकोड की पहली छमाही आवक कोड जैसे लापता के लिए एक सच्चे मैच वापस आ जाएगी SW1Aया BD25(या कम से कम यह मेरे लिए किया था) के बिना दूसरी छमाही
decvalts

7

यहाँ दस्तावेजों के निर्दिष्ट प्रारूप के आधार पर एक रेगेक्स दिया गया है, जो marcj के उत्तर से जुड़ा हुआ है:

/^[A-Z]{1,2}[0-9][0-9A-Z]? ?[0-9][A-Z]{2}$/

उस और स्पेक्स के बीच एकमात्र अंतर यह है कि पिछले 2 अक्षर स्पेक्स के अनुसार [CIKMOV] में नहीं हो सकते।

संपादित करें: यहां एक अन्य संस्करण है जो अनुगामी चरित्र सीमाओं के लिए परीक्षण करता है।

/^[A-Z]{1,2}[0-9][0-9A-Z]? ?[0-9][A-BD-HJLNP-UW-Z]{2}$/

ब्रिटेन के पोस्टकोड को स्वीकार करने की तुलना में बहुत अधिक जटिलताएं हैं A-Z- Qकभी भी अनुमति नहीं है, Vकेवल चरित्र की स्थिति के आधार पर, संयम से उपयोग किया जाता है।
ज़ाफ - बेन डुगिड

2
अगर आप चाहते हैं कि शायद एक वाक्यविन्यास जाँच है तो शायद अप्रासंगिक। जैसा कि कई अन्य लोगों ने टिप्पणी की है, केवल एक अप-टू-डेट डेटाबेस में एक खोज लगभग सही हो जाती है, और तब भी डेटाबेस अप-टू-डेट की समस्या है। तो, मेरे लिए, यह सिंटैक्स चेकर regex स्पष्ट, सरल और उपयोगी है।
रिक -777

5

ऊपर के कुछ रेक्सक्स थोड़े प्रतिबंधक हैं। वास्तविक पोस्टकोड पर ध्यान दें: "W1K 7AA" नियम को दिए जाने में विफल होगा "स्थिति 3 - AEHMNPRTVXY केवल" K "के ऊपर उपयोग किया जाएगा" को बंद कर दिया जाएगा।

रेगेक्स:

^(GIR 0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]|[A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y]))|[0-9][A-HJKPS-UW])[0-9][ABD-HJLNP-UW-Z]{2})$

थोड़ा और सटीक लगता है, विकिपीडिया लेख 'यूनाइटेड किंगडम में पोस्टकोड्स' शीर्षक देखें ।

ध्यान दें कि इस regex को केवल वर्णों के लिए अपरकेस की आवश्यकता है।

इससे भी बड़ा सवाल यह है कि क्या आप उपयोगकर्ता इनपुट को केवल पोस्टकोड की अनुमति देने के लिए प्रतिबंधित कर रहे हैं जो वास्तव में मौजूद हैं या क्या आप केवल उपयोगकर्ताओं को प्रपत्र फ़ील्ड में पूर्ण बकवास दर्ज करने से रोकने की कोशिश कर रहे हैं। सही तरीके से हर संभव पोस्टकोड का मिलान, और भविष्य में इसे प्रमाणित करना, एक कठिन पहेली है, और शायद तब तक इसके लायक नहीं है जब तक आप एचएमआरसी नहीं हैं।


ऐसा लगता है कि डाकघर आगे बढ़ गया है, लेकिन सरकार कुछ पीछे चल रही है :(
ज़ाफ - बेन डुगिडे

4
मैं इसका उपयोग करता हूं: "^ ([Gg] [Ii] [Rr] 0 [Aa] {2}) | ((([A-Za-z] [0-9] {1,2} (|) | [a-zA-Z] [ए-हा-HJ-YJ-y] [0-9] {1,2}) | (([a-zA-Z] [0-9] [a-zA-Z ]) | ((ए-ज़ा-ज़] [ए-हा-एचजे-यज-य] [0-9]? (ए-ज़-ज़-ज़]))) {०,१}} [०- ९] [ ए-ज़-ज़] {2}) $ "मुझे यह पसंद है क्योंकि यह ऊपरी और निचले मामलों की अनुमति देता है और अंतरिक्ष को वैकल्पिक बनाता है - प्रयोज्य के लिए बेहतर है, अगर 100% सही नहीं है!
बीटीटीवी

4

यहां बताया गया है कि हम यूके पोस्टकोड समस्या से कैसे निपटते हैं:

^([A-Za-z]{1,2}[0-9]{1,2}[A-Za-z]?[ ]?)([0-9]{1}[A-Za-z]{2})$

स्पष्टीकरण:

  • उम्मीद है कि 1 या 2 az chars, ऊपरी या निचला जुर्माना
  • 1 या 2 नंबर की उम्मीद है
  • उम्मीद है कि 0 या 1 az char, ऊपरी या निचला जुर्माना
  • वैकल्पिक स्थान की अनुमति दी
  • 1 नंबर की उम्मीद है
  • उम्मीद है कि 2 az, ऊपरी या निचला जुर्माना

यह सबसे अधिक प्रारूप प्राप्त करता है, फिर हम यह पुष्टि करने के लिए db का उपयोग करते हैं कि क्या पोस्टकोड वास्तव में वास्तविक है, यह डेटा ओपनपॉइंट द्वारा संचालित है https://www.ordnancesurvey.co.uk/opendatadownload/products.html

उम्मीद है की यह मदद करेगा


यह प्रारूप को अनुमति देता है AANNA NAA, जो अमान्य है।
ctwheels

इसलिए उत्तर के 'यह सबसे प्रारूप प्राप्त करता है'। :)
एलेक्स स्टीफंस

4

बुनियादी नियम:

^[A-Z]{1,2}[0-9R][0-9A-Z]? [0-9][ABD-HJLNP-UW-Z]{2}$

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

पूर्ण नियम:

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

^(?:(?:[A-PR-UWYZ][0-9]{1,2}|[A-PR-UWYZ][A-HK-Y][0-9]{1,2}|[A-PR-UWYZ][0-9][A-HJKSTUW]|[A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRV-Y]) [0-9][ABD-HJLNP-UW-Z]{2}|GIR 0AA)$

स्रोत: https://www.safaribooksonline.com/library/view/ अनियमित-expressions- 9781449327453 ch04s16.html

हमारे ग्राहकों के डेटाबेस के खिलाफ परीक्षण किया गया और पूरी तरह से सटीक लगता है।


4

मैं निम्नलिखित रेगेक्स का उपयोग करता हूं जो मैंने सभी वैध यूके पोस्टकोड के खिलाफ परीक्षण किया है। यह अनुशंसित नियमों पर आधारित है, लेकिन उचित के रूप में संघनित है और किसी विशेष भाषा विशिष्ट रेगेक्स नियमों का उपयोग नहीं करता है।

([A-PR-UWYZ]([A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y])?|[0-9]([0-9]|[A-HJKPSTUW])?) ?[0-9][ABD-HJLNP-UW-Z]{2})

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

विशेष "GIR0 0AA" पोस्टकोड को बाहर रखा गया है और इसे मान्य नहीं किया जाएगा क्योंकि यह पोस्टकोड की आधिकारिक पोस्ट ऑफिस सूची में नहीं है और जहां तक ​​मुझे पता है कि पंजीकृत पते के रूप में उपयोग नहीं किया जाएगा। यदि आवश्यक हो तो इसे जोड़ना एक विशेष मामले के रूप में तुच्छ होना चाहिए।


4

मैं एक साधारण रेगेक्स चाहता था, जहां बहुत अधिक अनुमति देना ठीक है, लेकिन एक वैध पोस्टकोड से इनकार नहीं करना। मैं इसके साथ गया था (इनपुट स्ट्रिप्ड / ट्रिम किया गया स्ट्रिंग है):

/^([a-z0-9]\s*){5,8}$/i

यह "L1 8JQ" के साथ-साथ "OL14 5ET" जैसे सबसे लंबे समय तक संभव सबसे कम पोस्टकोड की अनुमति देता है।

क्योंकि यह 8 अक्षरों तक की अनुमति देता है, यह गलत 8 वर्ण पोस्टकोड को भी अनुमति देगा यदि कोई स्थान नहीं है: "OL145ETX"। लेकिन फिर, यह एक सरलीकृत रेगेक्स है, जब यह काफी अच्छा है।


ओह, मेरी क्षमायाचना। मुझे लगता है कि जब मैं कल परीक्षण कर रहा था तो मुझे याद आया।
जॉन

3

पोस्टकोड मान्य प्रारूप का पहला भाग

  • [AZ] [AZ] [0-9] [AZ]
  • [AZ] [AZ] [0-9] [0-9]
  • [AZ] [0-9] [0-9]
  • [AZ] [AZ] [0-9]
  • [AZ] [AZ] [AZ]
  • [AZ] [0-9] [AZ]
  • [AZ] [0-9]

अपवाद
स्थिति 1 - QVX ने
स्थिति 2 का उपयोग नहीं किया - GJ 0AA
स्थिति 3 को छोड़कर IJZ का उपयोग नहीं किया गया - AEHMNPRTVXY केवल
स्थिति 4 का उपयोग किया - ABEHMNPRVWXY

पोस्टकोड का दूसरा आधा

  • [0-9] [AZ] [AZ]

अपवाद
स्थिति 2 + 3 - CIKMOV का उपयोग नहीं किया गया

याद रखें कि सभी संभावित कोड का उपयोग नहीं किया जाता है, इसलिए यह सूची एक वैध कोड के लिए आवश्यक नहीं बल्कि पर्याप्त स्थिति है। सभी वैध कोडों की सूची के खिलाफ मिलान करना आसान हो सकता है?


3

एक पोस्टकोड जांच करने के लिए रॉयल मेल के अनुसार एक वैध स्वरूप में है प्रोग्रामर की मार्गदर्शिका :

          |----------------------------outward code------------------------------| |------inward code-----|
#special↓       α1        α2    AAN  AANA      AANN      AN    ANN    ANA (α3)        N         AA
^(GIR 0AA|[A-PR-UWYZ]([A-HK-Y]([0-9][A-Z]?|[1-9][0-9])|[1-9]([0-9]|[A-HJKPSTUW])?) [0-9][ABD-HJLNP-UW-Z]{2})$

Doogal.co.uk पर सभी पोस्टकोड , अब उपयोग में नहीं रहने वालों को छोड़कर।

एक जोड़ा जा रहा है ?अंतरिक्ष के बाद और केस-संवेदी मिलान का उपयोग इस सवाल का जवाब करने के लिए:

'se50eg'.match(/^(GIR 0AA|[A-PR-UWYZ]([A-HK-Y]([0-9][A-Z]?|[1-9][0-9])|[1-9]([0-9]|[A-HJKPSTUW])?) ?[0-9][ABD-HJLNP-UW-Z]{2})$/ig);
Array [ "se50eg" ]

3

यदि आप सत्यापन को विफल नहीं करना चाहते हैं और फिर इसे गंभीर रूप से ट्रिम कर देना चाहते हैं तो यह रिक्त स्थान और टैब दोनों तरफ से अनुमति देता है।

^\s*(([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) {0,1}[0-9][A-Za-z]{2})\s*$)

यह एकमात्र पैटर्न है जो मूल प्रश्न में वर्णित उदाहरणों के साथ c # (System.Text.RegularExpressions) का उपयोग करके मेरे लिए काम करता है
मैटजेएस

यह यूके सरकार की टूटी हुई रेगेक्स है और यह कुछ मान्य प्रारूपों को मान्य करने में विफल है।
ctwheels

@ctwheels हाय, क्या आप कृपया एक असफल पोस्टकोड प्रदान कर सकते हैं, धन्यवाद।
माटस वैतकेविसियस

उदाहरण AAA 1AAएक मान्य प्रारूप नहीं है: स्पष्टीकरण के लिए मेरा उत्तर देखें और ठीक करें।
ctwheels

2

इस सूची में एक और अधिक व्यावहारिक रेगेक्स जोड़ने के लिए जो मैं उपयोग करता हूं जो उपयोगकर्ता को एक empty stringमें प्रवेश करने की अनुमति देता है:

^$|^(([gG][iI][rR] {0,}0[aA]{2})|((([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y]?[0-9][0-9]?)|(([a-pr-uwyzA-PR-UWYZ][0-9][a-hjkstuwA-HJKSTUW])|([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y][0-9][abehmnprv-yABEHMNPRV-Y]))) {0,1}[0-9][abd-hjlnp-uw-zABD-HJLNP-UW-Z]{2}))$

यह रेगेक्स बीच में एक वैकल्पिक स्थान के साथ पूंजी और निचले मामले पत्रों को अनुमति देता है

एक सॉफ्टवेयर डेवलपर्स के दृष्टिकोण से यह रेगेक्स सॉफ्टवेयर के लिए उपयोगी है जहां एक पता वैकल्पिक हो सकता है। उदाहरण के लिए यदि कोई उपयोगकर्ता अपने पते के विवरण की आपूर्ति नहीं करना चाहता था


1

इस पृष्ठ पर अजगर कोड पर एक नज़र है:

http://www.brunningonline.net/simon/blog/archives/001292.html

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

फिर भी, मैंने अपनी सोच को स्पष्ट करने के लिए एक छोटे से पायथन फ़ंक्शन को एक साथ फेंक दिया।

मैंने इसका उपयोग मेरे लिए पोस्टकोड को संसाधित करने के लिए किया है।


1

हमें एक युक्ति दी गई:

यूके पोस्टकोड निम्न रूपों में से एक में होना चाहिए (एक अपवाद के साथ, नीचे देखें): 
    AA ए 9 9 एए 
    AA ए 99 9 एए
    AA AA9 9AA
    AA AA99 9AA
    9 ए 9 ए 9 एए
    9 AA9A 9AA
जहां A वर्णमाला वर्ण का प्रतिनिधित्व करता है और 9 एक संख्यात्मक वर्ण का प्रतिनिधित्व करता है।
अतिरिक्त नियम अल्फ़ाबेटिक वर्णों पर लागू होते हैं, निम्नानुसार हैं:
    May स्थिति 1 में वर्ण Q, V या X नहीं हो सकता है
    § स्थिति 2 में वर्ण I, J या Z नहीं हो सकता है
    May स्थिति 3 में वर्ण I, L, M, N, O, P, Q, R, V, X, Y / Z नहीं हो सकता है
    May स्थिति 4 में वर्ण C, D, F, G, I, J, K, L, O, Q, S, T, U या Z नहीं हो सकता है
    § सही दो पदों में वर्ण C, I, K, M, O या V नहीं हो सकते हैं
इन सामान्य नियमों का पालन नहीं करने वाला एक अपवाद पोस्टकोड "जीआईआर 0 एए" है, जो एक विशेष वैध पोस्टकोड है।

हम इसके साथ आए:

/^([A-PR-UWYZ][A-HK-Y0-9](?:[A-HJKS-UW0-9][ABEHMNPRV-Y0-9]?)?\s*[0-9][ABD-HJLNP-UW-Z]{2}|GIR\s*0AA)$/i

लेकिन ध्यान दें - यह किसी भी संख्या में समूहों के बीच रिक्त स्थान की अनुमति देता है।


2
paulslater19, दुर्भाग्य से आपका समाधान A99A 9AA पोस्टकोड की अनुमति देता है।

1

मेरे पास यूके पोस्टकोड सत्यापन के लिए रेगेक्स है।

यह आंतरिक या बाहरी सभी प्रकार के पोस्टकोड के लिए काम कर रहा है

^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))) || ^((GIR)[ ]?(0AA))$|^(([A-PR-UWYZ][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][0-9][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][A-HK-Y0-9][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][A-HK-Y0-9][0-9][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][0-9][A-HJKS-UW0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][A-HK-Y0-9][0-9][ABEHMNPRVWXY0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$

यह सभी प्रकार के प्रारूप के लिए काम कर रहा है।

उदाहरण:

AB10 --------------------> केवल कंप्यूटर पोस्ट

A1 1AA ------------------> सहयोग (कंप्यूटर और INNER) POSTCODE

WC2A --------------------> बाहरी


1

स्वीकृत उत्तर रॉयल मेल द्वारा दिए गए नियमों को दर्शाता है, हालांकि रेगेक्स में एक टाइपो है। लगता है कि यह टाइपो gov.uk साइट पर भी है (जैसा कि यह XML संग्रह पृष्ठ में है)।

ए 9 ए 9 ए प्रारूप में नियम तीसरे स्थान पर एक पी वर्ण की अनुमति देते हैं, जबकि रेगेक्स इसे रोक देता है। सही रेगेक्स होगा:

(GIR 0AA)|((([A-Z-[QVX]][0-9][0-9]?)|(([A-Z-[QVX]][A-Z-[IJZ]][0-9][0-9]?)|(([A-Z-[QVX]][0-9][A-HJKPSTUW])|([A-Z-[QVX]][A-Z-[IJZ]][0-9][ABEHMNPRVWXY])))) [0-9][A-Z-[CIKMOV]]{2}) 

इस परिणाम को निम्न रीगेक्स में छोटा करें (जिसमें पर्ल / रूबी सिंटैक्स का उपयोग किया गया है):

(GIR 0AA)|([A-PR-UWYZ](([0-9]([0-9A-HJKPSTUW])?)|([A-HK-Y][0-9]([0-9ABEHMNPRVWXY])?))\s?[0-9][ABD-HJLNP-UW-Z]{2})

इसमें पहले और दूसरे ब्लॉक के बीच एक वैकल्पिक स्थान भी शामिल है।


1

मैंने लगभग सभी विविधताओं और बल्क ट्रांसफर पीडीएफ से rexx में क्या पाया है और विकिपीडिया साइट पर क्या है, यह विशेष रूप से विकिपीडिया regex के लिए है, पहले के बाद एक ^ होने की आवश्यकता है (ऊर्ध्वाधर बार)। मैंने एए 9 ए 9 एए के लिए परीक्षण करके यह पता लगाया, क्योंकि अन्यथा ए 9 ए 9 एए के लिए प्रारूप जांच इसे मान्य करेगी। उदाहरण के लिए EC1D 1BB की जाँच करना जो अमान्य होना चाहिए वापस मान्य है क्योंकि C1D 1BB एक वैध प्रारूप है।

यहाँ मैं एक अच्छे रेगेक्स के लिए क्या कर रहा हूँ:

^([G][I][R] 0[A]{2})|^((([A-Z-[QVX]][0-9]{1,2})|([A-Z-[QVX]][A-HK-Y][0-9]{1,2})|([A-Z-[QVX]][0-9][ABCDEFGHJKPSTUW])|([A-Z-[QVX]][A-HK-Y][0-9][ABEHMNPRVWXY])) [0-9][A-Z-[CIKMOV]]{2})$

1

अनुभवजन्य परीक्षण और अवलोकन के साथ-साथ https://en.wikipedia.org/wiki/Postcodes_in_the_United_Katalog#Validation के साथ पुष्टि करने के माध्यम से , यहाँ एक पायथन रीजेंसी का मेरा संस्करण है जो सही ढंग से पार्स करता है और यूके पोस्टकोड को मान्य करता है:

UK_POSTCODE_REGEX = r'(?P<postcode_area>[A-Z]{1,2})(?P<district>(?:[0-9]{1,2})|(?:[0-9][A-Z]))(?P<sector>[0-9])(?P<postcode>[A-Z]{2})'

यह रेगेक्स सरल है और इसमें कैप्चर ग्रुप हैं। इसमें कानूनी यूके पोस्टकोड के सभी सत्यापन शामिल नहीं हैं , लेकिन केवल पत्र बनाम संख्या पदों को ध्यान में रखता है।

यहाँ मैं इसे कोड में कैसे उपयोग करूंगा:

@dataclass
class UKPostcode:
    postcode_area: str
    district: str
    sector: int
    postcode: str

    # https://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom#Validation
    # Original author of this regex: @jontsai
    # NOTE TO FUTURE DEVELOPER:
    # Verified through empirical testing and observation, as well as confirming with the Wiki article
    # If this regex fails to capture all valid UK postcodes, then I apologize, for I am only human.
    UK_POSTCODE_REGEX = r'(?P<postcode_area>[A-Z]{1,2})(?P<district>(?:[0-9]{1,2})|(?:[0-9][A-Z]))(?P<sector>[0-9])(?P<postcode>[A-Z]{2})'

    @classmethod
    def from_postcode(cls, postcode):
        """Parses a string into a UKPostcode

        Returns a UKPostcode or None
        """
        m = re.match(cls.UK_POSTCODE_REGEX, postcode.replace(' ', ''))

        if m:
            uk_postcode = UKPostcode(
                postcode_area=m.group('postcode_area'),
                district=m.group('district'),
                sector=m.group('sector'),
                postcode=m.group('postcode')
            )
        else:
            uk_postcode = None

        return uk_postcode


def parse_uk_postcode(postcode):
    """Wrapper for UKPostcode.from_postcode
    """
    uk_postcode = UKPostcode.from_postcode(postcode)
    return uk_postcode

यहाँ इकाई परीक्षण हैं:

@pytest.mark.parametrize(
    'postcode, expected', [
        # https://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom#Validation
        (
            'EC1A1BB',
            UKPostcode(
                postcode_area='EC',
                district='1A',
                sector='1',
                postcode='BB'
            ),
        ),
        (
            'W1A0AX',
            UKPostcode(
                postcode_area='W',
                district='1A',
                sector='0',
                postcode='AX'
            ),
        ),
        (
            'M11AE',
            UKPostcode(
                postcode_area='M',
                district='1',
                sector='1',
                postcode='AE'
            ),
        ),
        (
            'B338TH',
            UKPostcode(
                postcode_area='B',
                district='33',
                sector='8',
                postcode='TH'
            )
        ),
        (
            'CR26XH',
            UKPostcode(
                postcode_area='CR',
                district='2',
                sector='6',
                postcode='XH'
            )
        ),
        (
            'DN551PT',
            UKPostcode(
                postcode_area='DN',
                district='55',
                sector='1',
                postcode='PT'
            )
        )
    ]
)
def test_parse_uk_postcode(postcode, expected):
    uk_postcode = parse_uk_postcode(postcode)
    assert(uk_postcode == expected)

0

मुझे एक संस्करण की आवश्यकता थी जो एसएएस में PRXMATCHऔर संबंधित कार्यों के साथ काम करेगा , इसलिए मैं इसके साथ आया:

^[A-PR-UWYZ](([A-HK-Y]?\d\d?)|(\d[A-HJKPSTUW])|([A-HK-Y]\d[ABEHMNPRV-Y]))\s?\d[ABD-HJLNP-UW-Z]{2}$

परीक्षण के मामले और नोट्स:

/* 
Notes
The letters QVX are not used in the 1st position.
The letters IJZ are not used in the second position.
The only letters to appear in the third position are ABCDEFGHJKPSTUW when the structure starts with A9A.
The only letters to appear in the fourth position are ABEHMNPRVWXY when the structure starts with AA9A.
The final two letters do not use the letters CIKMOV, so as not to resemble digits or each other when hand-written.
*/

/*
    Bits and pieces
    1st position (any):         [A-PR-UWYZ]         
    2nd position (if letter):   [A-HK-Y]
    3rd position (A1A format):  [A-HJKPSTUW]
    4th position (AA1A format): [ABEHMNPRV-Y]
    Last 2 positions:           [ABD-HJLNP-UW-Z]    
*/


data example;
infile cards truncover;
input valid 1. postcode &$10. Notes &$100.;
flag = prxmatch('/^[A-PR-UWYZ](([A-HK-Y]?\d\d?)|(\d[A-HJKPSTUW])|([A-HK-Y]\d[ABEHMNPRV-Y]))\s?\d[ABD-HJLNP-UW-Z]{2}$/',strip(postcode));
cards;
1  EC1A 1BB  Special case 1
1  W1A 0AX   Special case 2
1  M1 1AE    Standard format
1  B33 8TH   Standard format
1  CR2 6XH   Standard format
1  DN55 1PT  Standard format
0  QN55 1PT  Bad letter in 1st position
0  DI55 1PT  Bad letter in 2nd position
0  W1Z 0AX   Bad letter in 3rd position
0  EC1Z 1BB  Bad letter in 4th position
0  DN55 1CT  Bad letter in 2nd group
0  A11A 1AA  Invalid digits in 1st group
0  AA11A 1AA  1st group too long
0  AA11 1AAA  2nd group too long
0  AA11 1AAA  2nd group too long
0  AAA 1AA   No digit in 1st group
0  AA 1AA    No digit in 1st group
0  A 1AA     No digit in 1st group
0  1A 1AA    Missing letter in 1st group
0  1 1AA     Missing letter in 1st group
0  11 1AA    Missing letter in 1st group
0  AA1 1A    Missing letter in 2nd group
0  AA1 1     Missing letter in 2nd group
;
run;

0

नीचे विधि पोस्ट कोड की जांच करेगा और पूरी जानकारी प्रदान करेगा

const valid_postcode = postcode => {
    try {
        postcode = postcode.replace(/\s/g, "");
        const fromat = postcode
            .toUpperCase()
            .match(/^([A-Z]{1,2}\d{1,2}[A-Z]?)\s*(\d[A-Z]{2})$/);
        const finalValue = `${fromat[1]} ${fromat[2]}`;
        const regex = /^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))[0-9][A-Za-z]{2})$/i;
        return {
            isValid: regex.test(postcode),
            formatedPostCode: finalValue,
            error: false,
            info: 'It is a valid postcode'
        };
    } catch (error) {
        return { error: true , info: 'Invalid post code has been entered!'};
    }
};
valid_postcode('GU348RR')
result => {isValid: true, formatedPostCode: "GU34 8RR", error: false, info: "It is a valid postcode"}
valid_postcode('sdasd4746asd')
result => {error: true, info: "Invalid post code has been entered!"}
valid_postcode('787898523')
result => {error: true, info: "Invalid post code has been entered!"}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.