سؤال

انا بعد regex التي سوف صحة مجمع كامل المملكة المتحدة الرمز البريدي فقط ضمن سلسلة الإدخال.كل من المألوف الرمز البريدي أشكال يجب أن تكون مشمولة فضلا عن المعتاد.على سبيل المثال:

مباريات

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

لا مباراة

  • aWC2H 7LT
  • WC2H 7LTa
  • WC2H

كيف يمكنني حل هذه المشكلة ؟

هل كانت مفيدة؟

المحلول

أوصي بإلقاء نظرة على معيار بيانات حكومة المملكة المتحدة للرموز البريدية [الرابط الآن ميت؛ أرشيف XML, ، يرى ويكيبيديا للمناقشة].يوجد وصف مختصر حول البيانات ويوفر مخطط XML المرفق تعبيرًا عاديًا.قد لا يكون هذا بالضبط ما تريده ولكنه سيكون نقطة انطلاق جيدة.يختلف RegEx عن XML قليلًا، حيث أن الحرف P في الموضع الثالث بالتنسيق A9A 9AA مسموح به بموجب التعريف الموضح.

كان 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) وهم يقدمون اختبارًا أكثر صرامة يمكنك تجربته.

نصائح أخرى

يبدو أننا سنستخدم ^(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})$, ، وهي نسخة معدلة قليلاً من تلك التي اقترحها Minglis أعلاه.

ومع ذلك، سيتعين علينا التحقق من ماهية القواعد بالضبط، حيث يبدو أن الحلول المختلفة المذكورة أعلاه تطبق قواعد مختلفة فيما يتعلق بالحروف المسموح بها.

وبعد إجراء بعض الأبحاث، وجدنا المزيد من المعلومات.من الواضح أن صفحة على "govtalk.gov.uk" توجهك إلى مواصفات الرمز البريدي govtalk-الرموز البريدية.يشير هذا إلى مخطط XML في مخطط XML الذي يوفر بيان "التعبير العادي الزائف" لقواعد الرمز البريدي.

وقد أخذنا ذلك وعملنا عليه قليلاً ليعطينا التعبير التالي:

^((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}))$

وهذا لا يغطي الأقاليم الخارجية ويفرض التنسيق فقط، وليس وجود مناطق مختلفة.وهو يعتمد على القواعد التالية:

يمكن قبول التنسيقات التالية:

  • "جير 0AA"
  • A9 9ZZ
  • A99 9ZZ
  • AB9 9ZZ
  • AB99 9ZZ
  • ايه9سي 9ZZ
  • AD9E 9ZZ

أين:

  • 9 يمكن أن يكون أي رقم مكون من رقم واحد.
  • يمكن أن يكون A أي حرف باستثناء Q أو V أو X.
  • يمكن أن يكون B أي حرف باستثناء I أو J أو Z.
  • يمكن أن يكون 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.

أطيب التمنيات

كولن

لا يوجد شيء اسمه تعبير عادي شامل للرمز البريدي في المملكة المتحدة قادر على ذلك التحقق من صحة الرمز البريدي.يمكنك التحقق من أن الرمز البريدي بالتنسيق الصحيح باستخدام تعبير عادي؛ليس أنه موجود بالفعل.

الرموز البريدية معقدة بشكل تعسفي وتتغير باستمرار.على سبيل المثال، الكود الخارجي W1 لا تحتوي، وربما لا تحتوي أبدًا، على كل رقم يتراوح بين 1 و99 لكل منطقة رمز بريدي.

لا يمكنك أن تتوقع أن ما هو موجود حاليًا سيظل حقيقيًا إلى الأبد.على سبيل المثال، في عام 1990، قرر مكتب البريد أن أبردين أصبحت مزدحمة بعض الشيء.لقد أضافوا 0 إلى نهاية AB1-5 مما جعله AB10-50 ثم قاموا بإنشاء عدد من الرموز البريدية بينهما.

كلما تم إنشاء شارع جديد، يتم إنشاء رمز بريدي جديد.إنها جزء من عملية الحصول على إذن البناء؛السلطات المحلية ملزمة بإبقاء هذا الأمر محدثًا مع مكتب البريد (وليس هذا ما يفعلونه جميعًا).

علاوة على ذلك، وكما لاحظ عدد من المستخدمين الآخرين، هناك الرموز البريدية الخاصة مثل Girobank، وGIR 0AA، والرمز المخصص للرسائل إلى Santa، SAN TA1 - ربما لا ترغب في نشر أي شيء هناك ولكن لا يبدو أن سيتم تغطيتها بأي إجابة أخرى.

ثم، هناك الرموز البريدية BFPO، الموجودة الآن التغيير إلى تنسيق أكثر القياسية.كلا التنسيقين سيكونان صالحين.وأخيرًا، هناك مناطق ما وراء البحار المصدر ويكيبيديا.

+----------+----------------------------------------------+
| Postcode |                   Location                   |
+----------+----------------------------------------------+
| AI-2640  | Anguilla                                     |
| ASCN 1ZZ | Ascension Island                             |
| STHL 1ZZ | Saint Helena                                 |
| TDCU 1ZZ | Tristan da Cunha                             |
| BBND 1ZZ | British Indian Ocean Territory               |
| BIQQ 1ZZ | British Antarctic Territory                  |
| FIQQ 1ZZ | Falkland Islands                             |
| GX11 1AA | Gibraltar                                    |
| PCRN 1ZZ | Pitcairn Islands                             |
| SIQQ 1ZZ | South Georgia and the South Sandwich Islands |
| TKCA 1ZZ | Turks and Caicos Islands                     |
+----------+----------------------------------------------+

بعد ذلك، عليك أن تأخذ في الاعتبار أن المملكة المتحدة "صدرت" نظام الرمز البريدي الخاص بها إلى العديد من الأماكن في العالم.أي شيء يتحقق من صحة الرمز البريدي "المملكة المتحدة" سوف يتحقق أيضًا من صحة الرموز البريدية لعدد من البلدان الأخرى.

أذا أردت التحقق من صحة الرمز البريدي للمملكة المتحدة الطريقة الأكثر أمانًا للقيام بذلك هي استخدام البحث عن الرموز البريدية الحالية.هناك عدد من الخيارات:

  • إصدارات مسح الذخائر نقطة الكود مفتوحة بموجب ترخيص البيانات المفتوحة.سيكون متأخرًا قليلاً عن الزمن ولكنه مجاني.لن يشمل هذا (على الأرجح - لا أتذكر) بيانات أيرلندا الشمالية نظرًا لأن Ordnance Survey ليس له أي اختصاص هناك.يتم إجراء رسم الخرائط في أيرلندا الشمالية بواسطة Ordnance Survey of Northern Ireland، ولديهم برامج منفصلة ومدفوعة الأجر، المؤشر منتج.يمكنك استخدام هذا وإلحاق القليل الذي لم تتم تغطيته بسهولة إلى حد ما.

  • البريد الملكي يصدر ملف عنوان الرمز البريدي (PAF), ، وهذا يشمل BFPO الذي لست متأكدًا من أن Code-Point Open يفعله.يتم تحديثه بانتظام ولكنه يكلف أموالاً (ويمكن أن يكونوا لئيمين تمامًا بشأنه في بعض الأحيان).يتضمن PAF العنوان الكامل بدلاً من الرموز البريدية فقط ويأتي مع العنوان الخاص به دليل المبرمجين.تضغط مجموعة مستخدمي البيانات المفتوحة (ODUG) حاليًا من أجل إصدار PAF مجانًا، وهنا وصف لموقفهم.

  • وأخيرا، هناك قاعدة العنوان.يعد هذا تعاونًا بين Ordnance Survey والسلطات المحلية والبريد الملكي وشركة مطابقة لإنشاء دليل نهائي لجميع المعلومات حول جميع عناوين المملكة المتحدة (لقد حققوا نجاحًا كبيرًا أيضًا).إنه مدفوع الأجر، ولكن إذا كنت تعمل مع سلطة محلية أو دائرة حكومية أو خدمة حكومية، فيمكنهم استخدامه مجانًا.هناك معلومات أكثر بكثير من مجرد الرموز البريدية المضمنة.

لقد نشرت مؤخرا إجابة ل هذا السؤال على الرموز البريدية في المملكة المتحدة للغة R.لقد اكتشفت ذلك النمط العادي لحكومة المملكة المتحدة غير صحيح ويفشل في ذلك على وجه صحيح التحقق من صحة بعض الرموز البريدية.لسوء الحظ، تعتمد العديد من الإجابات هنا على هذا النمط غير الصحيح.

سأوضح بعضًا من هذه المشكلات أدناه وأقدم تعبيرًا عاديًا منقحًا في الحقيقة يعمل.


ملحوظة

إجابتي (والتعبيرات العادية بشكل عام):

  • التحقق من صحة الرمز البريدي فقط التنسيقات.
  • لا يضمن أن الرمز البريدي موجود بشكل شرعي.
    • لهذا، استخدم واجهة برمجة التطبيقات (API) المناسبة!يرى إجابة بن لمزيد من المعلومات.

إذا كنت لا تهتم تعبير عادي سيء وأريد فقط التخطي إلى الإجابة، انتقل لأسفل إلى إجابة قسم.

التعبير العادي السيئ

لا ينبغي استخدام التعبيرات العادية في هذا القسم.

هذا هو التعبير العادي الفاشل الذي قدمته حكومة المملكة المتحدة للمطورين (لست متأكدًا من المدة التي سيستمر فيها هذا الرابط، ولكن يمكنك رؤيته في وثائق نقل البيانات بالجملة):

^([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 من خلال.وذلك لأنهم قاموا بتثبيت بداية الخيار الأول ونهاية الخيار الثاني (بشكل مستقل عن بعضهما البعض)، كما هو موضح في التعبير العادي أعلاه.

ما يعنيه هذا هو أن ^ (يؤكد الموضع في بداية السطر) يعمل فقط على الخيار الأول ([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 - الأداء

الأداء في هذا regex ضعيف للغاية.أولاً، قاموا بوضع خيار النمط الأقل احتمالاً للمطابقة GIR 0AA في البداية.كم عدد المستخدمين الذين من المحتمل أن يكون لديهم هذا الرمز البريدي مقابل أي رمز بريدي آخر؛ربما أبدا؟وهذا يعني أنه في كل مرة يتم فيها استخدام التعبير العادي، يجب استنفاد هذا الخيار أولاً قبل الانتقال إلى الخيار التالي.لمعرفة مدى تأثر الأداء، تحقق من عدد الخطوات التعبير العادي الأصلي استغرق (35) ضد نفس التعبير العادي بعد قلب الخيارات (22).

المشكلة الثانية المتعلقة بالأداء ترجع إلى الطريقة التي يتم بها تنظيم التعبير العادي بأكمله.ليس هناك فائدة من التراجع عن كل خيار إذا فشل أحد الخيارات.يمكن تبسيط الطريقة التي يتم بها تنظيم التعبير العادي الحالي إلى حد كبير.أقدم إصلاحًا لهذا في إجابة قسم.

المشكلة 6-المسافات

انظر التعبير العادي المستخدم هنا

لا يجوز اعتبار هذا أ مشكلة, ، في حد ذاته، لكنه يثير قلق معظم المطورين.المسافات في التعبير العادي ليست اختيارية، مما يعني أنه يجب على المستخدمين الذين يقومون بإدخال الرموز البريدية الخاصة بهم وضع مسافة في الرمز البريدي.هذا حل سهل بمجرد الإضافة ? بعد المسافات لجعلها اختيارية.انظر إجابة قسم للإصلاح.


إجابة

1.إصلاح Regex لحكومة المملكة المتحدة

إصلاح جميع المشكلات الموضحة في مشاكل يؤدي القسم وتبسيط النمط إلى الحصول على النمط التالي والأقصر والأكثر إيجازًا.يمكننا أيضًا إزالة معظم المجموعات نظرًا لأننا نتحقق من صحة الرمز البريدي ككل (وليس الأجزاء الفردية):

انظر التعبير العادي المستخدم هنا

^([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})$

2.أنماط مبسطة

دون التأكد من أحرف أبجدية محددة، يمكن استخدام ما يلي (ضع في اعتبارك التبسيطات من 1.إصلاح Regex لحكومة المملكة المتحدة تم تطبيقها هنا أيضًا):

انظر التعبير العادي المستخدم هنا.

^([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.إصلاح Regex لحكومة المملكة المتحدة:

انظر التعبير العادي المستخدم هنا

^(([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}$

3.3 سانتا؟

هناك حالة خاصة أخرى مع سانتا (كما هو مذكور في الإجابات الأخرى): SAN TA1 هو رمز بريدي صالح.التعبير العادي لهذا هو بكل بساطة:

^SAN ?TA1$

لقد ألقيت نظرة على بعض الإجابات أعلاه وأوصي بعدم استخدام النموذج من @Dan's الجواب (ج.15 ديسمبر 2010), ، نظرًا لأنه يشير بشكل غير صحيح إلى ما يقرب من 0.4% من الرموز البريدية الصالحة على أنها غير صالحة، بينما لا يفعل الآخرون ذلك.

توفر Ordnance Survey خدمة تسمى Code Point Open والتي:

يحتوي على قائمة بجميع وحدات الرمز البريدي الحالية في بريطانيا العظمى

لقد قمت بتشغيل كل من التعابير العادية أعلاه مقابل القائمة الكاملة للرموز البريدية (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

أنا لا أقول شيئًا عن النمط الأفضل فيما يتعلق بتصفية الرموز البريدية غير الصالحة.

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

التعبير العادية إلى المباراة صالحة المملكة المتحدة الرموز البريدية.في المملكة المتحدة البريد لا كل الحروف المستخدمة في كافة المواقف (نفس الشيء مع تسجيل المركبات لوحات) و هناك العديد من القواعد تحكم هذا.هذا regex يأخذ في حساب تلك القواعد.تفاصيل القواعد:النصف الأول من الرمز البريدي صالح صيغ [A-Z][A-Z][0-9][A-Z] [A-Z][A-Z][0-9][0-9] [A-Z][0-9][0-9] [A-Z][A-Z][0-9] [A-Z][A-Z][A-Z] [A-Z][0-9][A-Z] [A-Z][0-9] استثناءات الموقف الأول.Contraint - QVX لا تستخدم الموضع الثاني.Contraint - IJZ لا تستخدم إلا في GIR 0AA الموضع الثالث.القيد - AEHMNPRTVXY تستخدم فقط موقف - وإيابا.Contraint - ABEHMNPRVWXY الثانية نصف الرمز البريدي صالح صيغ [0-9][A-Z][A-Z] الاستثناءات الموقف - الثانية والثالثة.Contraint - CIKMOV لم يستخدم

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

معظم الإجابات هنا لم تنجح مع جميع الرموز البريدية الموجودة في قاعدة البيانات الخاصة بي.لقد وجدت أخيرًا واحدًا يتم التحقق من صحته مع الجميع، باستخدام التعبير العادي الجديد الذي قدمته الحكومة:

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})$

تحديث:تم تحديث التعبير العادي كما أشار جيمي بول.لست متأكدًا مما إذا كان هذا خطأ مني أثناء النسخ أم أنه كان خطأ في التعبير العادي الحكومي، الرابط معطل الآن...

تحديث:كما وجدت ctwheels، يعمل هذا التعبير العادي مع نكهة جافا سكريبت regex.راجع تعليقه لمعرفة ما يعمل مع نكهة pcre (php).

وفقا لجدول ويكيبيديا هذا

enter image description here

يغطي هذا النمط جميع الحالات

(?:[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

منشور قديم ولكنه لا يزال مرتفعًا جدًا في نتائج 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) أن الإصدارات السابقة لم تفعل ذلك.

هذا هو التعبير العادي الذي تقدمه 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}

الرموز البريدية عرضة للتغيير، والطريقة الحقيقية الوحيدة للتحقق من صحة الرمز البريدي هي الحصول على القائمة الكاملة للرموز البريدية ومعرفة ما إذا كانت موجودة أم لا.

لكن التعبيرات العادية مفيدة لأنها:

  • سهلة الاستخدام والتنفيذ
  • قصيرة
  • سريعة في الجري
  • من السهل جدًا صيانتها (مقارنة بقائمة كاملة من الرموز البريدية)
  • لا يزال يلتقط معظم أخطاء الإدخال

لكن التعبيرات العادية تميل إلى أن تكون صعبة الصيانة، خاصة بالنسبة لشخص لم يبتكرها في المقام الأول.لذلك يجب أن يكون:

  • من السهل أن نفهم قدر الإمكان
  • دليل المستقبل نسبيا

هذا يعني أن معظم التعبيرات العادية في هذه الإجابة ليست جيدة بما فيه الكفاية.على سبيل المثالأستطيع أن أرى ذلك [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})

وبصيغة PCRE يمكن كتابتها على النحو التالي:

/^
  ( 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

بالنسبة لي، هذا هو التوازن الصحيح بين التحقق قدر الإمكان، وفي نفس الوقت التدقيق المستقبلي والسماح بسهولة الصيانة.

لقد كنت أبحث عن المملكة المتحدة الرمز البريدي regex في اليوم الأخير أو حتى تعثر على هذا الموضوع.عملت في طريقي من خلال معظم الاقتراحات أعلاه أيا منها لا يعمل بالنسبة لي لذا جاء مع بلدي regex وبقدر ما أعرف, يلتقط كل صالحة المملكة المتحدة الرموز البريدية اعتبارا من يناير '13 (وفقا لأحدث الأدب من البريد الملكي).

على regex والبعض بسيطة الرمز البريدي التحقق من رمز PHP يتم نشر أدناه.ملاحظة:- يسمح أقل أو الأحرف الكبيرة الرموز البريدية و خلي 0AA الشذوذ ولكن التعامل مع أكثر من المحتمل وجود مساحة في منتصف دخلت الرمز البريدي كما أنه يجعل استخدام بسيط str_replace لإزالة الفضاء قبل اختبار ضد regex.أي اختلافات أبعد من ذلك و البريد الملكي أنفسهم حتى لا ذكر لهم في الأدب (انظر http://www.royalmail.com/sites/default/files/docs/pdf/programmers_guide_edition_7_v5.pdf والبدء في القراءة من الصفحة 17)!

ملاحظة: في البريد الملكي الأدب (الرابط أعلاه) هناك طفيف الغموض الذي يكتنف 3 و 4 مواقف الاستثناءات في المكان إن هذه الأحرف هي الأحرف.اتصلت البريد الملكي مباشرة من الواضح أنه حتى في الكلمات الخاصة بهم "رسالة في موقف 4th من الخارج البرمجية شكل AANA ناه لا استثناءات و 3 موقف استثناءات لا تنطبق إلا على الحرف الأخير من الخارج البرمجية شكل آنا 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>";

    }

?>

وآمل أن يساعد أي شخص آخر يأتي عبر هذا الخيط في البحث عن حل.

إليك regex استنادًا إلى التنسيق المحدد في المستندات المرتبطة بإجابة marcj:

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

والفرق الوحيد بين ذلك وبين المواصفات هو أن آخر حرفين لا يمكن أن يكونا في [CIKMOV] وفقًا للمواصفات.

يحرر:إليك إصدار آخر يختبر قيود الأحرف الزائدة.

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

بعض التعابير المنطقية المذكورة أعلاه مقيدة بعض الشيء.لاحظ الرمز البريدي الحقيقي:قد يفشل "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})$

يبدو قليلا أكثر دقة، راجع مقالة ويكيبيديا بعنوان "الرموز البريدية في المملكة المتحدة".

لاحظ أن هذا التعبير العادي يتطلب أحرفًا كبيرة فقط.

السؤال الأكبر هو ما إذا كنت تقيد إدخال المستخدم للسماح فقط بالرموز البريدية الموجودة بالفعل أو ما إذا كنت تحاول ببساطة منع المستخدمين من إدخال نفايات كاملة في حقول النموذج.تعد مطابقة كل رمز بريدي محتمل بشكل صحيح، وإثباته في المستقبل، لغزًا أصعب، وربما لا يستحق كل هذا العناء إلا إذا كنت من إدارة الإيرادات والجمارك البريطانية.

القواعد الاساسية:

^[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/regular-expressions-cookbook/9781449327453/ch04s16.html

تم اختباره وفقًا لقاعدة بيانات عملائنا ويبدو أنه دقيق تمامًا.

أستخدم التعبير العادي التالي الذي قمت باختباره مقابل جميع الرموز البريدية الصالحة في المملكة المتحدة.وهو يعتمد على القواعد الموصى بها، ولكنه مكثف بقدر ما هو معقول ولا يستخدم أي قواعد تعبيرية خاصة بلغة معينة.

([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" ولن يتم التحقق من صحته لأنه غير موجود في قائمة الرموز البريدية الرسمية لمكتب البريد وعلى حد علمي لن يتم استخدامه كعنوان مسجل.يجب أن تكون إضافتها تافهة كحالة خاصة إذا لزم الأمر.

النصف الأول من الرمز البريدي تنسيقات صالحة

  • [AZ] [A-Z] [0-9] [A-Z]
  • [AZ] [A-Z] [0-9] [0-9]
  • [أ-ي] [0-9] [0-9]
  • [أ-ي] [أ-ي] [0-9]
  • [أ-ي] [أ-ي] [أ-ي]
  • [أ-ي] [0-9] [أ-ي]
  • [أ-ي] [0-9]

الاستثناءات
الموضع 1 - QVX غير مستخدم
الموضع 2 - لا يتم استخدام IJZ إلا في GIR 0AA
الموضع 3 - AEHMNPRTVXY مستخدم فقط
المركز 4-أبيهمنبرفوكسى

النصف الثاني من الرمز البريدي

  • [0-9] [أ-ي] [أ-ي]

الاستثناءات
الموضع 2+3 - لم يتم استخدام CIKMOV

تذكر أنه لم يتم استخدام كافة الرموز الممكنة، لذا فإن هذه القائمة شرط ضروري ولكنها ليست كافية للحصول على رمز صالح.قد يكون من الأسهل مطابقة قائمة بجميع الرموز الصالحة؟

إليك كيفية تعاملنا مع مشكلة الرمز البريدي في المملكة المتحدة:

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

توضيح:

  • توقع حرفًا واحدًا أو حرفين من الألف إلى الياء، العلوي أو السفلي جيدًا
  • توقع رقمًا واحدًا أو رقمين
  • توقع 0 أو 1 a-z char، العلوي أو السفلي جيدًا
  • مساحة اختيارية مسموح بها
  • توقع رقم 1
  • توقع 2 a-z، العلوي أو السفلي غرامة

يحصل هذا على معظم التنسيقات، ثم نستخدم قاعدة البيانات للتحقق من صحة ما إذا كان الرمز البريدي حقيقيًا أم لا، وهذه البيانات مدفوعة بنقطة مفتوحة https://www.ordnancesurvey.co.uk/opendatadownload/products.html

أتمنى أن يساعدك هذا

للتحقق من الرمز البريدي بتنسيق صالح وفقًا للبريد الملكي دليل المبرمج:

          |----------------------------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" ]

يسمح هذا بمساحات فارغة وعلامات تبويب من كلا الجانبين في حالة عدم رغبتك في فشل عملية التحقق من الصحة ثم قطعها من الجانب المقطوع.

^\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*$)

أردت تعبيرًا عاديًا بسيطًا، حيث يكون من الجيد السماح بالكثير، ولكن ليس رفض رمز بريدي صالح.ذهبت مع هذا (الإدخال عبارة عن سلسلة مجردة/مشذبة):

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

الأطوال من 5 إلى 7 (بدون احتساب المسافات البيضاء) تعني أننا نسمح بأقصر الرموز البريدية الممكنة مثل "L1 8JQ" بالإضافة إلى أطولها مثل "OL14 5ET".

يحرر:تم تغيير الرقم 8 إلى 7 حتى لا نسمح بالرموز البريدية المكونة من 8 أحرف.

لإضافة إلى هذه القائمة تعبير أكثر عملية أستخدمه والذي يسمح للمستخدم بإدخال ملف 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}))$

يسمح هذا التعبير العادي بأحرف كبيرة وصغيرة مع وجود مسافة اختيارية بينهما

من وجهة نظر مطوري البرامج، يعد هذا التعبير العادي مفيدًا للبرامج حيث قد يكون العنوان اختياريًا.على سبيل المثال، إذا لم يرغب المستخدم في تقديم تفاصيل عنوانه

ألق نظرة على كود بايثون في هذه الصفحة:

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

لقد حصلت على بعض تحليل الرمز البريدي للقيام به.الشرط بسيط جداً؛لا بد لي من تحليل الرمز البريدي إلى رمز خارجي ورمز داخلي (اختياري).الجديد الجيد هو أنني لست مضطرًا إلى إجراء أي تحقق من الصحة - كل ما علي فعله هو تقطيع ما تم تزويدي به بطريقة ذكية غامضة.لا أستطيع أن أفترض الكثير عن استيرادي من حيث التنسيق، أي.الحالة والمساحات المضمنة.ولكن هذه ليست الأخبار السيئة.الخبر السيئ هو أنني يجب أن أفعل كل شيء في لعبة آر بي جي.:-(

ومع ذلك، قمت بتجميع القليل من وظائف بايثون معًا لتوضيح تفكيري.

لقد استخدمته لمعالجة الرموز البريدية بالنسبة لي.

لقد أعطيت لنا المواصفات:

UK postcodes must be in one of the following forms (with one exception, see below): 
    § A9 9AA 
    § A99 9AA
    § AA9 9AA
    § AA99 9AA
    § A9A 9AA
    § AA9A 9AA
where A represents an alphabetic character and 9 represents a numeric character.
Additional rules apply to alphabetic characters, as follows:
    § The character in position 1 may not be Q, V or X
    § The character in position 2 may not be I, J or Z
    § The character in position 3 may not be I, L, M, N, O, P, Q, R, V, X, Y or Z
    § The character in position 4 may not be C, D, F, G, I, J, K, L, O, Q, S, T, U or Z
    § The characters in the rightmost two positions may not be C, I, K, M, O or V
The one exception that does not follow these general rules is the postcode "GIR 0AA", which is a special valid postcode.

لقد توصلنا إلى هذا:

/^([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

لكن لاحظ أن هذا يسمح بأي عدد من المسافات بين المجموعات.

لدي التعبير العادي للتحقق من صحة الرمز البريدي في المملكة المتحدة.

يعمل هذا مع جميع أنواع الرمز البريدي سواء الداخلي أو الخارجي

^((([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------------------>مزيج من الرمز البريدي (الخارجي والداخلي).

WC2A-------------------->خارجي

تعكس الإجابة المقبولة القواعد المقدمة من Royal Mail، على الرغم من وجود خطأ مطبعي في التعبير العادي.يبدو أن هذا الخطأ المطبعي كان موجودًا على موقع gov.uk أيضًا (كما هو الحال في صفحة أرشيف XML).

في التنسيق A9A 9AA، تسمح القواعد بحرف P في الموضع الثالث، بينما لا يسمح التعبير العادي بذلك.سيكون التعبير العادي الصحيح هو:

(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}) 

يؤدي تقصير هذا إلى التعبير العادي التالي (الذي يستخدم بناء جملة Perl/Ruby):

(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})

ويتضمن أيضًا مسافة اختيارية بين الكتلة الأولى والثانية.

ما وجدته تقريبًا في جميع الاختلافات والتعبير العادي من ملف pdf للنقل المجمع وما هو موجود على موقع ويكيبيديا هو هذا، على وجه التحديد بالنسبة لتعبير ويكيبيديا العادي، يجب أن يكون هناك ^ بعد الأول |(شريط عمودي).لقد اكتشفت ذلك من خلال اختبار AA9A 9AA، وإلا فإن التحقق من التنسيق لـ A9A 9AA سيتحقق من صحته.على سبيل المثال، يعد التحقق من 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})$

كنت بحاجة إلى إصدار يعمل في SAS مع 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;

ستتحقق الطريقة أدناه من الرمز البريدي وتوفر المعلومات الكاملة

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!"}

لقد سرقت هذا من مستند XML ويبدو أنه يغطي جميع الحالات بدون GIRO المشفر:

%r{[A-Z]{1,2}[0-9R][0-9A-Z]? [0-9][A-Z]{2}}i

(بناء جملة روبي مع حالة التجاهل)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top