আমি সম্প্রতি পোস্ট একটি উত্তর থেকে আর ভাষার জন্য যুক্তরাজ্য পছন্দমত পোস্ট কোড উপর এই প্রশ্ন । আমি আবিষ্কার করেছি যে ইউকে সরকারের রেজেক্স প্যাটার্নটি ভুল এবং কিছু পোস্টকোড সঠিকভাবে যাচাই করতে ব্যর্থ । দুর্ভাগ্যক্রমে, এখানে অনেক উত্তর এই ভুল প্যাটার্নের উপর ভিত্তি করে।
আমি নীচে এই বিষয়গুলির কয়েকটি রূপরেখা করব এবং সংশোধিত নিয়মিত ভাব প্রকাশ করব যা আসলে কাজ করে।
বিঃদ্রঃ
আমার উত্তর (এবং সাধারণভাবে নিয়মিত প্রকাশ):
- শুধুমাত্র পোস্টকোড ফর্ম্যাটগুলি বৈধতা দেয় ।
- বৈধভাবে একটি পোস্টকোড বিদ্যমান তা নিশ্চিত করে না ।
- এই জন্য, একটি উপযুক্ত এপিআই ব্যবহার করুন! দেখুন বেন এর উত্তর আরও তথ্যের জন্য।
আপনি যদি খারাপ রেজেক্স সম্পর্কে চিন্তা করেন না এবং কেবল উত্তরটি এড়াতে চান তবে উত্তর বিভাগে স্ক্রোল করুন ।
দ্য রেজেক্স
এই বিভাগে নিয়মিত প্রকাশগুলি ব্যবহার করা উচিত নয়।
এটি যুক্তরাজ্য সরকার বিকাশকারীদের সরবরাহ করেছে (এই লিঙ্কটি কত দিন স্থায়ী হবে তা নিশ্চিত নয়, তবে আপনি এটি তাদের বাল্ক ডেটা স্থানান্তর নথিতে দেখতে পারেন ):
^([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})$
^^ ^ ^ ^^
পোস্টকোড রেজেক্স অযৌক্তিকভাবে রিজেক্সকে অ্যাঙ্কর করে। পোস্টকোডগুলিকে বৈধতা দেওয়ার জন্য এই রেজেক্স ব্যবহার করা যে কেউ যদি এর মতো মানটি fooA11 1AA
পায় তবে অবাক হতে পারেন । কারণ তারা উপরের রেজেক্সে নির্দেশিত হয়েছে, প্রথম বিকল্পের শুরু এবং দ্বিতীয় বিকল্পের শেষে (একে অপরের থেকে স্বতন্ত্রভাবে) অ্যাঙ্কর করেছে That's
এর অর্থটি হ'ল ^
(লাইনের শুরুতে অবস্থানটি দৃser় করে) কেবলমাত্র প্রথম বিকল্পে কাজ করে ([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 - ভুল ptionচ্ছিক অক্ষর সেট
ব্যবহারের জন্য রেজেক্স দেখুন ।
^([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})$
^
আমি শপথ করছি তারা ওয়েবে এই প্রচার করার আগে তারা এই জিনিসটি পরীক্ষাও করেনি। তারা ভুল চরিত্র সেট alচ্ছিক করেছে। তারা [0-9]
বিকল্প 2 (গ্রুপ 9) এর চতুর্থ উপ-বিকল্পে বিকল্প তৈরি করেছে। এটি রেজ্যাগেক্সকে ভুল ফর্ম্যাটেড পোস্টকোডের মতো মেলানোর অনুমতি দেয় AAA 1AA
।
এই সমস্যাটি সমাধানের জন্য পরবর্তী অক্ষর শ্রেণীর পরিবর্তে alচ্ছিক করুন (এবং পরবর্তী সময়ে সেটটি [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
শুরুতে মেলাতে সবচেয়ে কম সম্ভাব্য প্যাটার্ন বিকল্পটি রেখেছিল । এই পোস্টকোড বনাম অন্য যে কোনও পোস্টকোডের তুলনায় কতজন ব্যবহারকারী সম্ভবত এই পোস্টকোড পাবেন; সম্ভবত না? এর অর্থ প্রতিবার যখন রেজেক্স ব্যবহার করা হবে তখন পরবর্তী বিকল্পে এগিয়ে যাওয়ার আগে প্রথমে এই বিকল্পটি নিঃশেষ করা উচিত। কর্মক্ষমতা কীভাবে প্রভাবিত হয় তা দেখার জন্য অপশনগুলি (২২) উল্টিয়ে ফেলার পরে একই রেজেক্সের বিরুদ্ধে আসল রিজেক্স (35) কী পদক্ষেপ নিয়েছিল তা পরীক্ষা করে দেখুন ।
পারফরম্যান্স সহ দ্বিতীয় ইস্যুটি পুরো রেজেক্সটি যেভাবে কাঠামোযুক্ত হয়েছে তার কারণে। যদি কোনও ব্যর্থ হয় তবে প্রতিটি বিকল্পের পিছনে পিছনে পিছনে ফিরে যাওয়ার কোনও কারণ নেই। বর্তমান রেজেক্সটি যেভাবে কাঠামোযুক্ত হয়েছে তা ব্যাপকভাবে সরল করা যেতে পারে। আমি উত্তর বিভাগে এটির জন্য একটি সমাধান সরবরাহ করি ।
সমস্যা 6 - স্পেস
ব্যবহারের জন্য রেজেক্স দেখুন
এটি প্রতি সমস্যা হিসাবে বিবেচিত হবে না , তবে এটি বেশিরভাগ বিকাশকারীদের জন্য উদ্বেগ বাড়িয়ে তোলে। রেজেক্সে থাকা স্পেসগুলি alচ্ছিক নয়, যার অর্থ ব্যবহারকারীরা তাদের পোস্টকোডগুলি ইনপুট করছে তাদের অবশ্যই পোস্টকোডে একটি স্থান রাখতে হবে। এগুলি ?
optionচ্ছিকভাবে রেন্ডার করার জন্য স্পেসগুলির পরে যুক্ত করে এটি একটি সহজ ফিক্স । ঠিক করার জন্য উত্তর বিভাগটি দেখুন ।
উত্তর
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
(আপনার Regex ইঞ্জিন এটিকে সমর্থন করে তাহলে):
ব্যবহারের জন্য রেজেক্স দেখুন ।
^([A-Z][A-HJ-Y]?\d[A-Z\d]? ?\d[A-Z]{2}|GIR ?0A{2})$
সরলীকৃত প্যাটার্নস
নির্দিষ্ট বর্ণানুক্রমিক অক্ষরগুলি নিশ্চিত না করে, নিম্নলিখিতগুলি ব্যবহার করা যেতে পারে ( 1 থেকে সরলকরণগুলি মনে রাখবেন 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 the যুক্তরাজ্য সরকারের রেজেক্সকে ঠিক করা :
ব্যবহারের জন্য রেজেক্স দেখুন
^(([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)$
৩.১ ব্রিটিশ বিদেশের অঞ্চল
উইকিপিডিয়া নিবন্ধে বর্তমানে বলা হয়েছে (কিছু ফর্ম্যাট কিছুটা সরল):
AI-1111
: অ্যাঙ্গুইলা
ASCN 1ZZ
: অ্যাসেনশন দ্বীপ
STHL 1ZZ
: সেন্ট হেলেনা
TDCU 1ZZ
: ত্রিস্তান দা কুনহা
BBND 1ZZ
: ব্রিটিশ ভারত মহাসাগর অঞ্চল
BIQQ 1ZZ
: ব্রিটিশ অ্যান্টার্কটিক অঞ্চল
FIQQ 1ZZ
: ফকল্যান্ড দ্বীপপুঞ্জ
GX11 1ZZ
: জিব্রাল্টার
PCRN 1ZZ
: পিটকার্ন দ্বীপপুঞ্জ
SIQQ 1ZZ
: দক্ষিণ জর্জিয়া এবং দক্ষিণ স্যান্ডউইচ দ্বীপপুঞ্জ
TKCA 1ZZ
: টার্কস্ ও কেইকোস দ্বীপপুঞ্জ
BFPO 11
: আকরোতিরি ও kelেকেলিয়া
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)$
৩.২ ব্রিটিশ ফোর্সেস পোস্ট অফিস
যদিও তারা সম্প্রতি এটি পরিবর্তন করে ব্রিটিশ পোস্টকোড সিস্টেমের সাথে আরও ভালভাবে সারিবদ্ধ করার জন্য BF#
(যেখানে #
একটি সংখ্যার প্রতিনিধিত্ব করে), তারা alচ্ছিক বিকল্প পোস্টকোড হিসাবে বিবেচিত হয় । এই পোস্টকোডগুলি (সম্পাদনা) এর ফর্ম্যাটটি BFPO
অনুসরণ করে, 1-4 টি সংখ্যার পরে:
ব্যবহারের জন্য রেজেক্স দেখুন
^BFPO ?\d{1,4}$
৩.৩ সান্তা?
সান্তার সাথে আরও একটি বিশেষ কেস রয়েছে (যেমন অন্যান্য উত্তরে উল্লিখিত হয়েছে): SAN TA1
একটি বৈধ পোস্টকোড। এর জন্য একটি রেজেেক্স খুব সহজ:
^SAN ?TA1$