मैं हाल ही में पोस्ट एक जवाब के लिए आर भाषा के लिए ब्रिटेन डाक कोड पर इस सवाल का । मुझे पता चला कि यूके सरकार का रेगेक्स पैटर्न गलत है और ठीक से विफल रहता है कुछ पोस्टकोड सत्यापित । दुर्भाग्य से, यहां कई उत्तर इस गलत पैटर्न पर आधारित हैं।
मैं इनमें से कुछ मुद्दों को नीचे रेखांकित करूँगा और एक नियमित नियमित अभिव्यक्ति प्रदान करूँगा जो वास्तव में काम करती है।
ध्यान दें
मेरा उत्तर (और सामान्य रूप से नियमित अभिव्यक्ति):
- केवल पोस्टकोड स्वरूपों को मान्य करता है ।
- यह सुनिश्चित नहीं करता है कि एक पोस्टकोड वैध रूप से मौजूद है ।
- इसके लिए, एक उपयुक्त एपीआई का उपयोग करें! अधिक जानकारी के लिए बेन का जवाब देखें ।
यदि आप खराब रेगेक्स के बारे में परवाह नहीं करते हैं और केवल उत्तर को छोड़ना चाहते हैं, तो उत्तर अनुभाग पर स्क्रॉल करें ।
द बैड रेगेक्स
इस खंड में नियमित अभिव्यक्तियों का उपयोग नहीं किया जाना चाहिए।
यह विफल रीजेक्स है जिसे यूके सरकार ने डेवलपर्स प्रदान किया है (यह सुनिश्चित नहीं है कि यह लिंक कितने समय तक रहेगा, लेकिन आप इसे अपने बल्क डेटा ट्रांसफर प्रलेखन में देख सकते हैं ):
^([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#
(जहां #
एक संख्या का प्रतिनिधित्व करता है), उन्हें वैकल्पिक वैकल्पिक पोस्टकोड माना जाता है । ये पोस्टकोड BFPO
1-4 अंकों के बाद (के) प्रारूप का अनुसरण करते हैं:
यहाँ उपयोग में रेगेक्स देखें
^BFPO ?\d{1,4}$
३.३ संता?
सांता के साथ एक और विशेष मामला है (जैसा कि अन्य उत्तरों में उल्लेख किया गया है): SAN TA1
एक वैध पोस्टकोड है। इस के लिए एक regex बहुत सरल है:
^SAN ?TA1$