RegEx สำหรับการจับคู่รหัสไปรษณีย์ของสหราชอาณาจักร


186

ฉันหลังจาก regex ที่จะตรวจสอบรหัสไปรษณีย์ของสหราชอาณาจักรที่ซับซ้อนอย่างเต็มรูปแบบเฉพาะภายในสตริงอินพุต แบบฟอร์มรหัสไปรษณีย์ที่ผิดปกติทั้งหมดจะต้องครอบคลุมเช่นเดียวกับแบบปกติ ตัวอย่างเช่น

ไม้ขีด

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

ไม่มีการแข่งขัน

  • aWC2H 7LT
  • WC2H 7LTa
  • WC2H

ฉันจะแก้ปัญหานี้ได้อย่างไร


2
@axrwkr ที่ดูไม่เป็นประโยชน์
Kieran Benton

8
การตรวจสอบรหัสไปรษณีย์ของสหราชอาณาจักร - JavaScript และ PHPฉันไม่สามารถรับคำตอบที่ตรงกับรหัสไปรษณีย์ที่ถูกต้อง แต่ฉันพบสิ่งนี้และตรงกับรหัสไปรษณีย์ที่ถูกต้อง สำหรับการตรวจสอบฝั่งไคลเอ็นต์เวอร์ชัน JavaScript สามารถใช้ตามที่เป็นอยู่สำหรับการตรวจสอบฝั่งเซิร์ฟเวอร์ให้เขียน JavaScript ใหม่เนื่องจาก C # ตรงไปตรงมา แม้จะทำการฟอร์แมตรหัสไปรษณีย์ใหม่เพื่อให้มีพื้นที่ว่างดังนั้นหากคุณป้อนรหัสไปรษณีย์เป็น W1A1AA นอกเหนือจากการตรวจสอบความถูกต้องแล้วจะทำการฟอร์แมตใหม่เป็น W1A 1AA มันยังเกี่ยวข้องกับรหัสไปรษณีย์ที่ผิดปกติในดินแดนต่างๆของอังกฤษ

2
ลิงก์ที่ให้มาใช้ไม่ได้กับรูปแบบ "AA1A 1AA" อ้างอิง: dhl.com.tw/content/dam/downloads/tw/express/forms/…
Anthony Scaife

1
หากคุณเพียงต้องการตรวจสอบรหัสไปรษณีย์เราขอเสนอการตรวจสอบจุดสิ้นสุด REST API ฟรี (ต้องการลงทะเบียน) - developers.alliescomputing.com/postcoder-web-api/address-lookup/
Stephen Keable

1
คำถามที่ดี. ฉันคิดว่ามันจะคุ้มค่าหากรวมถึงรหัสไปรษณีย์กลางของแมนเชสเตอร์เช่น "M1 3HZ" ในรายการตัวอย่างที่ไม่ธรรมดาที่ต้องจับคู่ หลายคนไม่รู้จักคอมโบหมายเลข 1 ตัวอักษร 1
Martin Joiner

คำตอบ:


208

ฉันขอแนะนำให้ดูที่รหัสข้อมูลของรัฐบาลสหราชอาณาจักรสำหรับรหัสไปรษณีย์ [ลิงค์ตายไปแล้ว; เก็บถาวรของ XMLดูWikipediaสำหรับการสนทนา] มีคำอธิบายสั้น ๆ เกี่ยวกับข้อมูลและสกีมา 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) และพวกเขาทำการทดสอบที่เข้มงวดยิ่งขึ้นที่คุณสามารถลองได้


52
และนั่นคือพื้นที่สีขาวเสริมระหว่างสองเซกเมนต์ (GIR 0AA) | (([[AZ- [QVX]] [0-9] [0-9]?) | (([AZ- [QVX]] [AZ- [IJZ]] [0-9] [0-9])? | (([AZ- [QVX]] [0-9] [A-HJKSTUW]) | ([AZ- [QVX]] [ AZ- [IJZ]] [0-9] [ABEHMNPRVWXY])))) \ s? [0-9] [AZ- [CIKMOV]] {2})
gb2d

7
อาจจะมีความคิดที่ดีที่จะนำ regex ที่เกิดขึ้นจริงที่จะตอบตั้งแต่หน้าดูเหมือนจะหมดอายุทุกปี ...
pauloya

7
โปรดทราบว่า regex นี้มีไว้สำหรับ XML Schema ซึ่งเห็นได้ชัดว่าแตกต่างจากรสชาติอื่น ๆ ของ regex เล็กน้อย
artbristol

6
ฉันไม่สามารถใช้งาน JavaScript ได้ ใช้ได้กับเอ็นจิน regex บางตัวเท่านั้นหรือไม่
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})$งานซึ่งเป็นเวอร์ชั่นดัดแปลงเล็กน้อยของ Minglis ข้างต้น

อย่างไรก็ตามเราจะต้องตรวจสอบให้แน่ชัดว่ากฎคืออะไรเนื่องจากโซลูชั่นต่าง ๆ ที่ระบุไว้ด้านบนดูเหมือนจะใช้กฎที่แตกต่างกันตามที่อนุญาตให้ใช้จดหมาย

หลังจากการวิจัยเราพบข้อมูลเพิ่มเติมแล้ว เห็นได้ชัดว่าหน้าบนจุด 'govtalk.gov.uk' คุณข้อกำหนดรหัสไปรษณีย์govtalk-ไปรษณีย์ สิ่งนี้ชี้ไปที่สกีมา XML ที่XML Schemaซึ่งมีคำสั่ง 'หลอกหลอก' ของกฎรหัสไปรษณีย์

เราได้ทำสิ่งนั้นและพยายามทำสิ่งนี้เล็กน้อยเพื่อให้เราแสดงออกดังต่อไปนี้:

^((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
  • A9C 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

ด้วยความปรารถนาดี

โคลิน


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

เหตุใดจึงต้องระบุ{0,}แทน*ช่องว่างเพิ่มเติมและไม่ จำกัด
รหัสสัตว์

76

ผมเพิ่งโพสต์คำตอบให้กับคำถามนี้ในสหราชอาณาจักรรหัสไปรษณีย์สำหรับภาษาอาร์ ฉันค้นพบว่ารูปแบบ regex ของรัฐบาลอังกฤษไม่ถูกต้องและไม่สามารถตรวจสอบรหัสไปรษณีย์ได้อย่างถูกต้อง น่าเสียดายที่คำตอบมากมายที่นี่ขึ้นอยู่กับรูปแบบที่ไม่ถูกต้องนี้

ฉันจะสรุปปัญหาเหล่านี้ด้านล่างและให้นิพจน์ทั่วไปที่แก้ไขซึ่งใช้งานได้


บันทึก

คำตอบของฉัน (และนิพจน์ทั่วไปโดยทั่วไป):

  • ตรวจสอบรูปแบบรหัสไปรษณีย์เท่านั้น
  • ไม่แน่ใจว่ามีรหัสไปรษณีย์ถูกต้องตามกฎหมายหรือไม่
    • สำหรับสิ่งนี้ใช้ API ที่เหมาะสม! ดูคำตอบของ Benสำหรับข้อมูลเพิ่มเติม

หากคุณไม่สนใจเกี่ยวกับregex ที่ไม่ดีและเพียงต้องการข้ามไปยังคำตอบให้เลื่อนลงไปที่ส่วนคำตอบ

Regex ไม่ดี

ไม่ควรใช้นิพจน์ทั่วไปในส่วนนี้

นี่คือ 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})$

ปัญหาที่เกิดขึ้น

ปัญหาที่ 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})|(([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 จะไม่จับคู่รหัสไปรษณีย์กับช่องว่างในนั้น (นอกเหนือจาก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 - ขอบเขต

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

รหัสไปรษณีย์ regex เชื่อมโยง regex ไม่ถูกต้อง ทุกคนที่ใช้ regex นี้เพื่อตรวจสอบความถูกต้องของรหัสไปรษณีย์อาจแปลกใจหากค่าที่fooA11 1AAได้รับผ่าน นั่นเป็นเพราะพวกเขาได้ยึดจุดเริ่มต้นของตัวเลือกแรกและจุดสิ้นสุดของตัวเลือกที่สอง (เป็นอิสระจากกัน) ตามที่ชี้ใน regex ข้างต้น

สิ่งนี้หมายความว่า^(ยืนยันตำแหน่งที่จุดเริ่มต้นของบรรทัด) ใช้งานได้กับตัวเลือกแรก([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 - ชุดอักขระที่ไม่เหมาะสม

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

regex หายไป-ที่นี่เพื่อระบุช่วงของอักขระ ตามที่ปรากฏหากรหัสไปรษณีย์อยู่ในรูปแบบANA NAA(โดยที่AหมายถึงตัวอักษรและNแทนตัวเลข) และเริ่มต้นด้วยสิ่งอื่นที่ไม่ใช่AหรือZมันจะล้มเหลว

หมายความว่ามันจะตรงA1A 1AAและแต่ไม่Z1A 1AAB1A 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 - ชุดอักขระทางเลือกไม่ถูกต้อง

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

ฉันสาบานว่าพวกเขาไม่ได้ทดสอบสิ่งนี้ก่อนที่จะเผยแพร่บนเว็บ พวกเขาทำให้ชุดอักขระที่ไม่ถูกต้องเป็นตัวเลือก พวกเขาทำตัว[0-9]เลือกในตัวเลือกย่อยที่สี่ของตัวเลือก 2 (กลุ่ม 9) นี้จะช่วยให้ regex 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กับจุดเริ่มต้น มีผู้ใช้กี่คนที่จะมีรหัสไปรษณีย์นี้เทียบกับรหัสไปรษณีย์อื่น ๆ อาจจะไม่เคย? ซึ่งหมายความว่าทุกครั้งที่ใช้งาน regex จะต้องใช้ตัวเลือกนี้เสียก่อนจึงจะดำเนินการตามตัวเลือกถัดไป เพื่อดูว่าประสิทธิภาพได้รับผลกระทบอย่างไรให้ตรวจสอบจำนวนขั้นตอนที่regex ดั้งเดิมใช้ (35) เทียบกับregex เดียวกันหลังจากพลิกตัวเลือก (22)

ปัญหาที่สองที่มีประสิทธิภาพเป็นเพราะโครงสร้างทั้งหมดของ regex ไม่มีการย้อนจุดในแต่ละตัวเลือกหากล้มเหลว วิธีที่โครงสร้าง regex ปัจจุบันสามารถทำให้ง่ายขึ้นอย่างมาก ฉันให้การแก้ไขในส่วนคำตอบ

ปัญหาที่ 6 - ช่องว่าง

ดูการใช้งาน regex ที่นี่

สิ่งนี้อาจไม่ถือว่าเป็นปัญหาแต่ก็สร้างความกังวลให้กับนักพัฒนาส่วนใหญ่ ช่องว่างใน regex ไม่ใช่ตัวเลือกซึ่งหมายความว่าผู้ใช้ที่ป้อนรหัสไปรษณีย์จะต้องวางช่องว่างในรหัสไปรษณีย์ นี่คือการแก้ไขที่ง่ายเพียงเพิ่ม?หลังช่องว่างเพื่อแสดงเป็นตัวเลือก ดูส่วนคำตอบสำหรับการแก้ไข


ตอบ

1. แก้ไข Regex ของรัฐบาลอังกฤษ

แก้ไขปัญหาทั้งหมดที่สรุปไว้ในส่วนของปัญหาและทำให้รูปแบบง่ายขึ้นให้รูปแบบต่อไปนี้สั้นลงและกระชับยิ่งขึ้น เรายังสามารถลบกลุ่มส่วนใหญ่ได้เนื่องจากเราตรวจสอบรหัสไปรษณีย์โดยรวม (ไม่ใช่แต่ละส่วน):

ดูการใช้งาน 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})$

สิ่งนี้สามารถย่อให้สั้นลงได้โดยลบช่วงทั้งหมดออกจากหนึ่งในกรณี (ตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก) และใช้แฟล็กตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ หมายเหตุ : บางภาษาไม่มีภาษาให้ใช้ภาษาที่มีความยาวมากกว่าด้านบน แต่ละภาษาใช้การตั้งค่าตัวพิมพ์เล็กและตัวพิมพ์ใหญ่แตกต่างกัน

ดู regex ในการใช้งานที่นี่

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

เปลี่ยนให้สั้นลง[0-9]ด้วย\d(ถ้าเครื่องยนต์ regex ของคุณรองรับ):

ดู regex ในการใช้งานที่นี่

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

2. รูปแบบที่เรียบง่าย

โดยไม่ทำให้อักขระตัวอักษรเฉพาะเจาะจงสามารถใช้สิ่งต่อไปนี้ได้ (โปรดจำไว้ว่า simplifications จาก1 การแก้ไข Regex ของรัฐบาลสหราชอาณาจักรได้ถูกนำมาใช้ที่นี่ด้วย):

ดู 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. รูปแบบที่ซับซ้อน

ฉันจะไม่แนะนำการตรวจสอบรหัสไปรษณีย์มากเกินไปเนื่องจากอาจมีพื้นที่ใหม่เขตและตำบลใหม่ปรากฏขึ้น ณ เวลาใด ๆ สิ่งที่ฉันจะแนะนำให้ทำอาจเพิ่มการรองรับขอบเคส บางกรณีพิเศษที่มีอยู่และมีการระบุไว้ในบทความวิกิพีเดียนี้

นี่คือ regexes ที่ซับซ้อนซึ่งรวมถึงส่วนย่อยของ3 (3.1, 3.2, 3.3)

เกี่ยวกับรูปแบบใน1. การแก้ไข Regex ของรัฐบาลสหราชอาณาจักร :

ดูการใช้งาน 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. รูปแบบประยุกต์ :

ดูการใช้งาน regex ที่นี่

^(([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 ดินแดนโพ้นทะเลของอังกฤษ

บทความ Wikipedia ปัจจุบันระบุว่า (บางรูปแบบง่ายขึ้นเล็กน้อย):

  • AI-1111: Anguila
  • ASCN 1ZZ: เกาะสวรรค์
  • STHL 1ZZ: เซนต์เฮเลน่า
  • TDCU 1ZZ: Tristan da Cunha
  • BBND 1ZZ: มณฑลบริติชอินเดียนโอเชียน
  • BIQQ 1ZZ: มณฑลบริติชแอนตาร์กติก
  • FIQQ 1ZZ: หมู่เกาะฟอล์คแลนด์
  • GX11 1ZZยิบรอลตาร์
  • PCRN 1ZZ: หมู่เกาะพิตแคร์น
  • SIQQ 1ZZ: เกาะเซาท์จอร์เจียและหมู่เกาะเซาท์แซนด์วิช
  • TKCA 1ZZ: หมู่เกาะเติกส์และหมู่เกาะเคคอส
  • BFPO 11: Akrotiri และ Dhekelia
  • ZZ 11& GE CX: เบอร์มิวดา (ตามเอกสารนี้ )
  • KY1-1111: หมู่เกาะเคย์แมน (ตามเอกสารนี้ )
  • VG1111: หมู่เกาะบริติชเวอร์จิน (อ้างอิงจากเอกสารนี้ )
  • MSR 1111: มอนต์เซอร์รัต (ตามเอกสารนี้ )

regex ที่ครอบคลุมเพื่อให้ตรงกับดินแดนโพ้นทะเลของอังกฤษอาจมีลักษณะเช่นนี้:

ดู regex ในการใช้งานที่นี่

^((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#(ซึ่ง#หมายถึงตัวเลข) ได้ดีขึ้น แต่พวกเขาก็ถือว่าเป็นรหัสทางเลือกเพิ่มเติม รหัสไปรษณีย์เหล่านี้ติดตาม (ed) รูปแบบของBFPOตามด้วยตัวเลข 1-4 หลัก:

ดูการใช้งาน regex ที่นี่

^BFPO ?\d{1,4}$

3.3 ซานต้า?

มีอีกกรณีพิเศษกับซานต้า (ดังที่ได้กล่าวไว้ในคำตอบอื่น ๆ ): SAN TA1เป็นรหัสไปรษณีย์ที่ถูกต้อง regex สำหรับเรื่องนี้ง่ายมาก:

^SAN ?TA1$

4
รูปแบบที่เรียบง่ายเป็นตัวเลือกที่ดีมากสำหรับการใช้งาน ฉันคิดว่ามันเป็นการดีที่สุดที่จะไม่เข้มงวดกับ regex มากเกินไปเนื่องจากคุณต้องตรวจสอบให้แน่ใจว่าได้รับการปรับปรุงด้วยการเปลี่ยนแปลงใด ๆ หรือคุณอาจมีผู้ใช้โกรธมาก ฉันรู้สึกดีกว่าที่จะจับคู่กับ regex แบบง่าย ๆ เพื่อกำจัดข้อผิดพลาดที่เห็นได้ชัดจากนั้นจึงใช้การตรวจสอบเพิ่มเติมเช่นการค้นหาที่อยู่ (หรืออีเมลยืนยันในกรณีของ regex อีเมล) เพื่อยืนยันความถูกต้อง
James Coyle

2
การวิเคราะห์ที่ยอดเยี่ยมและทั่วถึง
Steve

1
คำตอบที่ยอดเยี่ยมในหลาย ๆ ระดับ ในที่สุดฉันไปกับรูปแบบที่ 2 ของคุณง่ายขึ้น เนื่องจากฉันมีฐานข้อมูลพร้อมรหัสไปรษณีย์ของสหราชอาณาจักรทั้งหมดในนั้นฉันต้องผ่านครั้งแรกเพื่อดูว่าสตริงที่อยู่อาจมีรหัสไปรษณีย์ที่ถูกต้องหรือไม่ดังนั้นฉันจึงไม่สนใจสิ่งที่ผิดพลาด (เนื่องจากการค้นหาที่แท้จริงจะหยั่งราก) แต่ฉันสนใจเรื่องเชิงลบที่ผิด ๆ และความเร็วยังสำคัญ
John Powell

มีปัญหามากมายเกี่ยวกับระบบรหัสไปรษณีย์ของสหราชอาณาจักรซึ่งสร้างโดยคณะกรรมการก่อนยุคคอมพิวเตอร์ แต่ปัญหาของความยาวและช่องว่างของตัวแปรเป็นหนึ่งในปัญหาที่อันตรายที่สุด ฉันได้เห็นความน่ากลัวในทุกรูปแบบรวมถึงการเพิ่มรหัสไปรษณีย์เช่น E1 5JX ถึง E1 5JX เช่นมีช่องว่างสามช่องเพื่อให้สอดคล้องกับ SW18 5HA ใน Excel (แทรกซอฟต์แวร์ที่ไม่เหมาะสมสำหรับการจัดการที่อยู่) วิธีแก้ปัญหาที่มีสติเดียว IMHO คือการแยกช่องว่างทั้งหมดออกเพื่อให้รหัสไปรษณีย์เป็นสตริงเดียวก่อนที่จะเข้าใกล้ Elastic, Solr, Postgres และอื่น ๆ
John Powell

45

ไม่มีสิ่งใดเป็นนิพจน์ทั่วไปของรหัสไปรษณีย์สหราชอาณาจักรที่ครอบคลุมซึ่งสามารถตรวจสอบรหัสไปรษณีย์ได้ คุณสามารถตรวจสอบว่ารหัสไปรษณีย์อยู่ในรูปแบบที่ถูกต้องโดยใช้นิพจน์ทั่วไป ไม่ใช่ว่ามันมีอยู่จริง

รหัสไปรษณีย์มีความซับซ้อนโดยพลการและเปลี่ยนแปลงอยู่ตลอดเวลา ตัวอย่างเช่นรหัสW1ไม่ได้และอาจไม่เคยมีทุกหมายเลขระหว่าง 1 ถึง 99 สำหรับทุกพื้นที่รหัสไปรษณีย์

คุณไม่สามารถคาดหวังได้ว่าสิ่งใดที่มีอยู่จริงในปัจจุบัน ตัวอย่างเช่นในปี 1990 ที่ทำการไปรษณีย์ได้ตัดสินใจว่าอเบอร์ดีนเริ่มแออัดไปเล็กน้อย พวกเขาเพิ่ม 0 ไปที่จุดสิ้นสุดของ AB1-5 ทำให้ AB10-50 แล้วสร้างจำนวนรหัสไปรษณีย์ระหว่างนี้

เมื่อใดก็ตามที่ถนนเส้นใหม่สร้างรหัสไปรษณีย์ใหม่จะถูกสร้างขึ้น เป็นส่วนหนึ่งของกระบวนการในการขออนุญาตสร้าง หน่วยงานท้องถิ่นมีหน้าที่ต้องอัปเดตข้อมูลนี้กับที่ทำการไปรษณีย์ (ไม่ใช่ว่าพวกเขาทำทั้งหมด)

นอกจากนี้ตามที่ระบุไว้โดยผู้ใช้อื่นจำนวนมากมีรหัสไปรษณีย์พิเศษเช่น Girobank, GIR 0AA และตัวอักษรสำหรับ Santa, SAN TA1 - คุณอาจไม่ต้องการโพสต์อะไรที่นั่น แต่ดูเหมือนจะไม่ปรากฏ ได้รับการคุ้มครองโดยคำตอบอื่น ๆ

แล้วมีของไปรษณีย์ BFPO ซึ่งขณะนี้เปลี่ยนไปเป็นรูปแบบมาตรฐานมากขึ้น ทั้งสองรูปแบบจะถูกต้อง สุดท้ายมีเป็นดินแดนโพ้นทะเลของแหล่งที่มาของวิกิพีเดีย

+ + -------------------------------------- ---------- -------- +
| รหัสไปรษณีย์ สถานที่ตั้ง
+ + -------------------------------------- ---------- -------- +
| AI-2640 | แองกวิลลา
| ASCN 1ZZ | เกาะสวรรค์
| STHL 1ZZ | เซนต์เฮเลน่า |
| TDCU 1ZZ | Tristan da Cunha |
| BBND 1ZZ | มณฑลบริติชอินเดียนโอเชียน
| BIQQ 1ZZ | มณฑลบริติชแอนตาร์กติก
| FIQQ 1ZZ | หมู่เกาะฟอล์คแลนด์
| GX11 1AA | ยิบรอลตาร์
| PCRN 1ZZ | หมู่เกาะพิตแคร์น
| SIQQ 1ZZ | เกาะเซาท์จอร์เจียและหมู่เกาะเซาท์แซนด์วิช |
| TKCA 1ZZ | หมู่เกาะเติร์กส์และเคคอส
+ + -------------------------------------- ---------- -------- +

ถัดไปคุณต้องคำนึงว่าสหราชอาณาจักร "ส่งออก" ระบบรหัสไปรษณีย์ไปยังสถานที่ต่างๆในโลก อะไรก็ตามที่ตรวจสอบรหัสไปรษณีย์ "สหราชอาณาจักร" จะตรวจสอบรหัสไปรษณีย์ของประเทศอื่น ๆ ด้วย

หากคุณต้องการตรวจสอบรหัสไปรษณีย์ในสหราชอาณาจักรวิธีที่ปลอดภัยที่สุดคือการใช้รหัสไปรษณีย์ปัจจุบันเพื่อค้นหา มีตัวเลือกมากมาย:

  • การสำรวจอาวุธยุทโธปกรณ์ปล่อยCode-Point Openภายใต้ใบอนุญาตข้อมูลแบบเปิด มันจะช้าไปหน่อย แต่ก็ฟรี นี้จะ (อาจ - ฉันจำไม่ได้) ไม่รวมข้อมูลภาคเหนือของไอร์แลนด์เป็นแบบสำรวจอาวุธยุทโธปกรณ์ไม่มีการส่งเงินที่นั่น การทำแผนที่ในไอร์แลนด์เหนือดำเนินการโดยการสำรวจอาวุธยุทโธปกรณ์ของไอร์แลนด์เหนือและมีผลิตภัณฑ์พอยน์เตอร์แยกจำหน่ายและจ่ายเงินของพวกเขา คุณสามารถใช้สิ่งนี้และผนวกสิ่งที่ไม่ครอบคลุมได้อย่างง่ายดาย

  • Royal Mail เปิดตัวไฟล์รหัสไปรษณีย์ (PAF)ซึ่งรวมถึง BFPO ซึ่งฉันไม่แน่ใจว่า Code-Point Open ทำเช่นไร มีการอัปเดตเป็นประจำ แต่มีค่าใช้จ่าย (และอาจมีความหมายที่จริงจังในบางครั้ง) PAF รวมถึงที่อยู่เต็มมากกว่าแค่การไปรษณีย์และมาพร้อมกับของตัวเองคู่มือโปรแกรมเมอร์ เปิดข้อมูลกลุ่มผู้ใช้ (ODUG) กำลังวิ่งเต้นที่จะมี PAF ปล่อยให้ฟรีที่นี่เป็นคำอธิบายของตำแหน่งของพวกเขา

  • สุดท้ายมีAddressBaseอยู่ นี่คือการทำงานร่วมกันระหว่างการสำรวจอาวุธยุทโธปกรณ์เจ้าหน้าที่ท้องถิ่นจดหมายรอยัลและ บริษัท ที่ตรงกันเพื่อสร้างไดเรกทอรีที่ชัดเจนของข้อมูลทั้งหมดเกี่ยวกับที่อยู่ในสหราชอาณาจักรทั้งหมด (พวกเขาก็ประสบความสำเร็จเช่นกัน) มันจ่ายเงินให้ แต่ถ้าคุณทำงานร่วมกับหน่วยงานท้องถิ่นหน่วยงานรัฐบาลหรือหน่วยงานราชการมันฟรีสำหรับพวกเขาที่จะใช้ มีข้อมูลมากมายมากกว่าแค่การรวมรหัสไปรษณีย์


การค้นหาเสียงที่น่าสนใจ
SuperUberDuper

2
ในขณะที่นี่ไม่ใช่คำตอบที่ op มองหามันอาจเป็นประโยชน์มากที่สุด สิ่งนี้จะกระตุ้นให้ฉันผ่อนคลายกฎการตรวจสอบที่ฉันจะทำ
John Hunt

22

ฉันดูคำตอบบางข้อด้านบนและฉันไม่แนะนำให้ใช้รูปแบบจากคำตอบของ @ Dan (c. 15 ธ.ค. '10)เนื่องจากมีการตั้งค่าสถานะรหัสไปรษณีย์ที่ถูกต้องเกือบ 0.4% ของรหัสไปรษณีย์ที่ถูกต้องว่าไม่ถูกต้อง .

การสำรวจยุทโธปกรณ์ให้บริการที่เรียกว่า Code Point Open ซึ่ง:

มีรายชื่อหน่วยไปรษณีย์ปัจจุบันทั้งหมดในสหราชอาณาจักร

ฉันใช้แต่ละ regexs ข้างต้นกับรายการรหัสไปรษณีย์ (6 ก.ค. 56) ทั้งหมดจากข้อมูลนี้โดยใช้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
นี่ไม่ใช่สิ่งที่ฉันพูดในคำตอบของฉันและหากคุณกำลังลงเส้นทางที่ไม่ปลอดภัยคุณควรทำทุกอย่างและให้อัปเดตหากมีใครเปลี่ยนคำตอบ ถ้าไม่อย่างน้อยอ้างอิงวันที่แก้ไขครั้งล่าสุดของคำตอบที่คุณได้รับจากคนอื่นเพื่อดูว่ามีการเปลี่ยนแปลงหรือไม่
Ben

จุดยุติธรรม แก้ไขตามนั้น ฉันคิดว่ามันเพิ่มการอภิปรายเพื่อชี้ให้เห็นว่ารูปแบบเหล่านี้ส่วนใหญ่ไม่ได้ยกเว้นรหัส CPO ใด ๆ แต่คำตอบที่ถูก upvoted ที่สุด (ถูกต้อง regex) ทำ ผู้อ่านในอนาคต: โปรดทราบว่าผลลัพธ์ของฉันน่าจะล้าสมัย
RichardTowers

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

นิพจน์ทั่วไปเพื่อให้ตรงกับรหัสไปรษณีย์ของสหราชอาณาจักรที่ถูกต้อง ในระบบไปรษณีย์ของสหราชอาณาจักรจะไม่มีการใช้ตัวอักษรทั้งหมดในทุกตำแหน่ง (เช่นเดียวกับป้ายทะเบียนรถ) และมีกฎหลายข้อที่ใช้บังคับในเรื่องนี้ regex นี้คำนึงถึงกฎเหล่านั้น รายละเอียดของกฎ: ครึ่งแรกของรหัสไปรษณีย์รูปแบบที่ถูกต้อง [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] [AZ] [0-9] ตำแหน่งข้อยกเว้น - อันดับแรก Contraint - QVX ไม่ได้ใช้ตำแหน่ง - ที่สอง Contraint - IJZ ไม่ได้ใช้ยกเว้นในตำแหน่ง GIR 0AA - ที่สาม ข้อ จำกัด - AEHMNPRTVXY ใช้เฉพาะตำแหน่ง - มา Contraint - ABEHMNPRVWXY ช่วงครึ่งหลังของรหัสไปรษณีย์รูปแบบที่ถูกต้อง [0-9] [AZ] [AZ] [AZ] ตำแหน่งข้อยกเว้น - ที่สองและสาม Contraint - CIKMOV ไม่ได้ใช้

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


1
ไม่มีความคิดว่าทำไมผู้คนถึงลงคะแนนคำตอบนี้ - มันเป็น regex ที่ถูกต้อง
Ollie

regex ใช้ไม่ได้กับรหัสไปรษณีย์ "YO31" และ "YO31 1" ใน Javscript
Pratik Khadloya

9
ฉันไม่คิดว่าสิ่งนี้ถูกต้องเนื่องจาก regex ให้คำอธิบายที่ขัดแย้งกับคำแนะนำและคุณสามารถมีรหัสไปรษณีย์ที่ขึ้นต้นด้วย0-9ซึ่งคุณทำไม่ได้
Luigi Plinge

4
regex นี้ล้มเหลวในรหัสไปรษณีย์ที่ถูกต้องประมาณ 6,000 ดังนั้นฉันจึงขอแนะนำให้ใช้ ดูคำตอบของฉัน
RichardTowers

สิ่งนี้จะล้มเหลวในรหัสไปรษณีย์ใด ๆ ที่เป็นตัวพิมพ์เล็กหรือไม่มีที่ว่างสำหรับฉัน
Dancer

14

ตามตาราง Wikipedia นี้

ป้อนคำอธิบายรูปภาพที่นี่

รูปแบบนี้ครอบคลุมทุกกรณี

(?:[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 แต่ก็ดีพอสำหรับกรณีการใช้งานของฉัน หลังจากเล่นกับมันสักหน่อย (เป็นไพ ธ อน) ฉันก็เห็นว่ามันมีขนาดเล็กกว่า แต่มี regex ที่เท่ากันซึ่งอนุญาตให้มีพื้นที่เสริม: ([a-zA-Z] (?: (?: [a-zA-] Z] \ d [a-zA-Z]) | (: \ d {1,2}) | (:? [a-zA-Z] \ d {1,2})) \ W [0 -9] [a-zA-Z] {2})
Richard J

14

คำตอบส่วนใหญ่ที่นี่ไม่สามารถใช้ได้กับรหัสไปรษณีย์ทั้งหมดที่ฉันมีในฐานข้อมูลของฉัน ในที่สุดฉันก็พบหนึ่งที่ตรวจสอบได้กับทุกคนโดยใช้ regex ใหม่ที่ได้รับจากรัฐบาล:

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 อัปเดตตามที่ชี้โดย Jamie Bull ไม่แน่ใจว่ามันเป็นการคัดลอกข้อผิดพลาดของฉันหรือเป็นข้อผิดพลาดใน regex ของรัฐบาลการเชื่อมโยงอยู่ตอนนี้ ...

ปรับปรุง: ตามที่พบ ctwheel, regex นี้ใช้งานได้กับ javascript regex flavor ดูความคิดเห็นของเขาสำหรับคนที่ทำงานกับรสชาติ pcre (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})$- สังเกตเห็นความแตกต่าง ;-)
Jamie Bull

1
จับได้เห็นชัดตรงเผง! อัปเดตคำตอบของฉัน ขอบคุณ!
Jesús Carrera

2
นี่เป็นคำตอบเดียวที่นี่ที่ทำงานในregexr.comและ Notepad ++ แม้ว่าฉันจะเปลี่ยนเป็น([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})(ลบ^และ$เพิ่มพื้นที่?หลัง) สำหรับregexr.comเพื่อค้นหาผลลัพธ์มากกว่าหนึ่งรายการและสำหรับทั้งคู่เพื่อค้นหาผลลัพธ์ที่ไม่มีตัวคั่นช่องว่าง
mythofechelon

@ctwheels regex นี้มีไว้สำหรับรสชาติของจาวาสคริปต์ หากลิงค์ของคุณล้มเหลวคุณเลือกจาวาสคริปต์มันจะทำงานได้ นั่นเป็นเรื่องที่ยอดเยี่ยมมากและฉันจะอัปเดตคำตอบของฉัน
Jesús Carrera

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
สิ่งเดียวที่ฉันจะพูดคือทำให้เป็นตัวเลือกของพื้นที่โดยการเปลี่ยนพื้นที่เป็น \ s? เนื่องจากพื้นที่ไม่จำเป็นสำหรับการอ่าน
ศาสตราจารย์การเขียนโปรแกรม

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

ในรูปแบบ 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

สำหรับฉันนี่คือความสมดุลที่เหมาะสมระหว่างการตรวจสอบให้มากที่สุดเท่าที่จะเป็นไปได้ในขณะเดียวกันก็พิสูจน์ได้ในอนาคตและช่วยให้บำรุงรักษาง่าย


ไม่แน่ใจว่าทำไมคุณถึงได้ลงคะแนน - มันใช้ได้กับรหัสไปรษณีย์ที่ถูกต้องทั้งหมดที่ฉันโยนไปแล้วและช่องว่างซึ่งคำตอบข้างต้นจำนวนมากไม่สามารถจัดการได้อย่างถูกต้อง มีใครสนใจที่จะอธิบายว่าทำไม
Jon

1
@ จอนมันยังตรงกับเมื่อตัวละครอื่น ๆ ถูกผนวกเข้ากับจุดเริ่มต้นหรือจุดสิ้นสุดเช่นaSW1A 1AAasfgจับคู่สำหรับฉัน (ฉันไม่ได้ downvote แม้ว่าดูเหมือนว่ามันจะสามารถแก้ไขได้อย่างง่ายดาย)
decvalts

9

ฉันกำลังมองหารหัสไปรษณีย์ของสหราชอาณาจักรในวันสุดท้ายหรือมากกว่านั้นและสะดุดในหัวข้อนี้ ฉันทำงานผ่านข้อเสนอแนะส่วนใหญ่ด้านบนและไม่มีใครทำงานให้ฉันดังนั้นฉันจึงคิดว่า regex ของฉันเองซึ่งเท่าที่ฉันรู้ได้รวบรวมรหัสไปรษณีย์ของสหราชอาณาจักรที่ถูกต้องทั้งหมดตั้งแต่เดือนมกราคมปี 13 (ตามเอกสารล่าสุดจาก รอยัลเมล์)

regex และรหัสไปรษณีย์ง่ายๆบางอย่างที่ตรวจสอบโค้ด PHP ถูกโพสต์ด้านล่าง หมายเหตุ: - อนุญาตให้ใช้รหัสไปรษณีย์ที่ต่ำกว่าหรือตัวพิมพ์ใหญ่และความผิดปกติของ GIR 0AA แต่จะจัดการกับพื้นที่ที่อยู่ตรงกลางของรหัสไปรษณีย์ที่ป้อนลงไปมากกว่าที่เป็นไปได้และยังใช้ str_replace เพื่อลบพื้นที่ก่อนการทดสอบ กับ regex ความแตกต่างใด ๆ ที่เกินกว่านั้นและรอยัลเมล์เองก็ไม่ได้เอ่ยถึงพวกเขาในวรรณกรรม (ดูhttp://www.royalmail.com/sites/default/files/docs/pdf/programmers_guide_edition_7_v5.pdfและเริ่มอ่านจากหน้า 17) !

หมายเหตุ:ในวรรณคดีของ Royal Mail (ลิงค์ด้านบน) มีความคลุมเครือเล็กน้อยรอบตำแหน่งที่ 3 และ 4 และมีข้อยกเว้นหากตัวอักษรเหล่านี้เป็นตัวอักษร ฉันติดต่อ Royal Mail โดยตรงเพื่อล้างมันและในคำพูดของตัวเอง "จดหมายในตำแหน่งที่ 4 ของ Outward Code ในรูปแบบ AANA NAA ไม่มีข้อยกเว้นและข้อยกเว้นตำแหน่งที่ 3 จะใช้เฉพาะกับตัวอักษรสุดท้ายของ Outward Code ที่มี ฟอร์แมต 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
ฉันอยากรู้ว่ารหัสไปรษณีย์ตัวอย่างใดที่ไม่สามารถเผยแพร่ได้
Zhaph - Ben Duguid

ฉันไม่สามารถให้รหัสไปรษณีย์เฉพาะแก่คุณ (โดยไม่ต้องเข้าถึงรายการ PAF แบบเต็ม) แต่รหัสไปรษณีย์ที่มีรูปแบบ ANA NAA อาจล้มเหลวเนื่องจากอนุญาตให้ใช้ตัวอักษร P และ Q ในตำแหน่งที่ 3 และรหัสไปรษณีย์ด้วยรูปแบบ AANA NAA ก็ล้มเหลวเนื่องจากตำแหน่งที่ 4 อนุญาตให้ตัวอักษรทั้งหมด (regex ที่ให้ไว้ในคำตอบที่ยอมรับด้านบนไม่ได้อธิบายถึงสิ่งเหล่านี้) ตามที่ฉันบอกว่าฉันจะทำตามคำแนะนำปัจจุบันจาก Royal Mail - ในเวลาที่คำตอบข้างต้นบางที regex นั้นเป็นไปตามอย่างสมบูรณ์
Dan Solo

ขอบคุณสำหรับหัวขึ้น - ฉันจะเห็นว่า "P" ดูเหมือนจะได้รับการเพิ่มเป็นที่ยอมรับในตำแหน่งที่สาม (จากเอกสารที่เชื่อมโยงของคุณ) แต่ไม่ใช่ Q - แต่คุณอ่านว่า "ตำแหน่งที่ 4 อนุญาตตัวอักษรทั้งหมด" ได้ที่ไหน หมอไม่เอ่ยถึงตำแหน่งที่ "มา" เท่าที่ฉันเห็นดังนั้นฉันจึงอ่านว่า "ตัวอักษรตัวที่สามโดยไม่คำนึงถึงตำแหน่งที่แท้จริง"
Zhaph - Ben Duguid

1
เพิ่งได้รับคำตอบกลับจากทีมสนับสนุน Royal Mail และการตีความกฎของฉันนั้นถูกต้องชัดเจน จดหมายในตำแหน่งที่ 4 ของรหัสภายนอก (เช่น AANA NAA) ไม่มีข้อยกเว้นและข้อยกเว้นตำแหน่งที่ 3 จะใช้กับจดหมายฉบับสุดท้ายเท่านั้น (เช่น ANA NAA) ตรงจากปากม้า
Dan Solo

1
@DanSolo regex นี้จะส่งคืนการจับคู่ที่แท้จริงสำหรับครึ่งแรกของรหัสไปรษณีย์ที่ถูกต้องที่ขาดรหัสขาเข้าเช่นSW1AหรือBD25ไม่มีครึ่งที่สอง (หรืออย่างน้อยก็ทำเพื่อฉัน)
decvalts

7

นี่คือ regex ตามรูปแบบที่ระบุในเอกสารที่เชื่อมโยงกับคำตอบของ 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มีการใช้เพียงเล็กน้อยเท่านั้นทั้งนี้ขึ้นอยู่กับตำแหน่งของตัวละคร
Zhaph - Ben Duguid

2
นั่นอาจไม่เกี่ยวข้องหากสิ่งที่คุณต้องการคือการตรวจสอบไวยากรณ์ ตามที่คนอื่น ๆ หลายคนตั้งข้อสังเกตเฉพาะการค้นหาในฐานข้อมูลที่เป็นปัจจุบันนั้นเกือบจะถูกต้องแล้วและถึงแม้จะมีปัญหาว่าฐานข้อมูลที่ทันสมัยนั้นเป็นอย่างไร ดังนั้นสำหรับฉัน regex ตัวตรวจสอบไวยากรณ์นี้ชัดเจนง่ายและมีประโยชน์
Rick-777

5

regexs ข้างต้นบางข้อมีข้อ จำกัด เล็กน้อย โปรดสังเกตรหัสไปรษณีย์ของแท้: "W1K 7AA" จะล้มเหลวเนื่องจากกฎ "ตำแหน่ง 3 - AEHMNPRTVXY ใช้เฉพาะ" ด้านบนเนื่องจาก "K" จะไม่ได้รับอนุญาต

regex:

^(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 นี้ต้องการตัวอักษรตัวพิมพ์ใหญ่เท่านั้น

คำถามที่ใหญ่กว่าคือคุณ จำกัด การป้อนข้อมูลของผู้ใช้เพื่อให้อนุญาตเฉพาะรหัสไปรษณีย์ที่มีอยู่จริงหรือไม่หรือคุณพยายามที่จะหยุดให้ผู้ใช้ป้อนขยะลงในช่องกรอกแบบฟอร์ม การจับคู่รหัสไปรษณีย์ที่เป็นไปได้อย่างถูกต้องทุกครั้งและการพิสูจน์อักษรในอนาคตเป็นปริศนาที่ยากกว่าและอาจไม่คุ้มค่าหากคุณไม่ใช่ HMRC


ดูเหมือนว่าที่ทำการไปรษณีย์ได้ย้ายไปแล้ว แต่รัฐบาลกำลังล้าหลังบ้าง :(
Zhaph - Ben Duguid

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}) | (([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}) $ "ฉันชอบมากเพราะมันสามารถใช้ตัวพิมพ์ใหญ่และตัวพิมพ์เล็กและทำให้มีพื้นที่ว่าง - ดีกว่าสำหรับการใช้งานถ้าไม่ถูกต้อง 100%!
bigtv

4

นี่คือวิธีที่เราจัดการกับปัญหารหัสไปรษณีย์ของสหราชอาณาจักร:

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

คำอธิบาย:

  • คาดว่าจะมี 1 หรือ 2 az ตัวอักษรปรับขึ้นหรือลง
  • คาดว่าหมายเลข 1 หรือ 2
  • คาดว่าจะมีค่า 0 หรือ 1 az, ปรับขึ้นหรือลง
  • อนุญาตให้ใช้พื้นที่เสริม
  • คาดว่า 1 หมายเลข
  • คาดว่า 2 az, ปรับขึ้นหรือลง

นี่เป็นรูปแบบส่วนใหญ่จากนั้นเราใช้ db เพื่อตรวจสอบว่ารหัสไปรษณีย์เป็นจริงหรือไม่ข้อมูลนี้ถูกขับเคลื่อนโดย openpoint https://www.ordnancesurvey.co.uk/opendatadownload/products.html

หวังว่านี่จะช่วยได้


นี่อนุญาตรูปแบบAANNA NAAที่ไม่ถูกต้อง
ctwheels

ดังนั้นส่วนนี้จะได้รับส่วนใหญ่ของคำตอบ :)
Alex Stephens

4

กฎพื้นฐาน:

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

รหัสไปรษณีย์ในสหราชอาณาจักร (หรือรหัสไปรษณีย์ในขณะที่พวกเขาเรียกว่า) ประกอบด้วยตัวอักษรและตัวเลขห้าถึงเจ็ดตัวคั่นด้วยช่องว่าง กฎที่ครอบคลุมตัวละครที่สามารถปรากฏในตำแหน่งที่เฉพาะเจาะจงค่อนข้างซับซ้อนและเต็มไปด้วยข้อยกเว้น การแสดงออกปกติแสดงเพียงแค่ยึดติดกับกฎพื้นฐาน

กฎที่สมบูรณ์:

หากคุณต้องการ regex ที่ทำเครื่องหมายในช่องทั้งหมดสำหรับกฎรหัสไปรษณีย์โดยมีค่าใช้จ่ายในการอ่านค่าได้ที่นี่คุณจะไป:

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

ทดสอบกับฐานข้อมูลลูกค้าของเราและดูเหมือนแม่นยำอย่างสมบูรณ์


4

ฉันใช้ regex ต่อไปนี้ที่ฉันได้ทดสอบกับรหัสไปรษณีย์ของสหราชอาณาจักรที่ถูกต้องทั้งหมด มันขึ้นอยู่กับกฎที่แนะนำ แต่ย่อให้มากที่สุดเท่าที่สมเหตุสมผลและไม่ใช้กฎ regex เฉพาะภาษาใด ๆ

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

ฉันต้องการ regex แบบง่ายที่อนุญาตให้มากเกินไป แต่ไม่ปฏิเสธรหัสไปรษณีย์ที่ถูกต้อง ฉันไปกับสิ่งนี้ (อินพุตเป็นสตริงที่ถูกตัด / ตัด):

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

วิธีนี้จะทำให้รหัสไปรษณีย์สั้นที่สุดที่เป็นไปได้เช่น "L1 8JQ" และรหัสที่ยาวที่สุดเช่น "OL14 5ET"

เนื่องจากอนุญาตได้สูงสุด 8 อักขระจึงอนุญาตรหัสไปรษณีย์ 8 อักขระที่ไม่ถูกต้องหากไม่มีที่ว่าง: "OL145ETX" แต่อีกครั้งนี่คือ regex แบบง่ายๆเพราะเมื่อใดที่ดีพอ


โอ้ขอโทษนะ ฉันคิดว่าฉันพลาด / i เมื่อฉันทำการทดสอบเมื่อวานนี้
John

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 - IJZ ไม่ได้ใช้ยกเว้นใน GIR 0AA
ตำแหน่ง 3 - AEHMNPRTVXY ใช้เฉพาะ
ตำแหน่ง 4 - ABEHMNPRVWXY

ครึ่งหลังของรหัสไปรษณีย์

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

ข้อยกเว้น
ตำแหน่ง 2 + 3 - CIKMOV ไม่ได้ใช้

โปรดจำไว้ว่าไม่ได้ใช้รหัสที่เป็นไปได้ทั้งหมดดังนั้นรายการนี้เป็นเงื่อนไขที่จำเป็น แต่ไม่เพียงพอสำหรับรหัสที่ถูกต้อง มันอาจจะง่ายกว่าที่จะจับคู่กับรายการของรหัสที่ถูกต้องทั้งหมดหรือไม่


3

ในการตรวจสอบรหัสไปรษณีย์นั้นอยู่ในรูปแบบที่ถูกต้องตามคู่มือโปรแกรมเมอร์ของ Royal Mail :

          |----------------------------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) พร้อมตัวอย่างที่อธิบายไว้ในคำถามเดิม
MattjeS

นี่คือ regex ที่ใช้งานไม่ได้ของรัฐบาลสหราชอาณาจักรและไม่สามารถตรวจสอบรูปแบบที่ถูกต้องได้
ล้อ

@ctwheels สวัสดีคุณช่วยระบุรหัสไปรษณีย์ที่ล้มเหลวได้ไหมขอบคุณ
Matas Vaitkevicius

เช่นAAA 1AAไม่ใช่รูปแบบที่ถูกต้อง: ดูคำตอบของฉันสำหรับคำอธิบายและการแก้ไข
ล้อ

2

เพื่อเพิ่มรายการนี้ regex ปฏิบัติมากขึ้นที่ฉันใช้ที่อนุญาตให้ผู้ใช้ป้อน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}))$

regex นี้อนุญาตให้ใช้ตัวพิมพ์ใหญ่และตัวพิมพ์เล็กด้วยช่องว่างที่เป็นทางเลือก

จากนักพัฒนาซอฟต์แวร์ในมุมมองของ regex นี้มีประโยชน์สำหรับซอฟต์แวร์ที่อยู่อาจเป็นตัวเลือก ตัวอย่างเช่นหากผู้ใช้ไม่ต้องการระบุรายละเอียดที่อยู่


1

ดูรหัสไพ ธ อนในหน้านี้:

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

ฉันมีรหัสการแยกวิเคราะห์ที่ต้องทำ ความต้องการค่อนข้างง่าย ฉันต้องแยกรหัสไปรษณีย์เป็นรหัสและ (ไม่จำเป็น) รหัส ใหม่ที่ดีคือฉันไม่ต้องทำการตรวจสอบใด ๆ - ฉันต้องสับสิ่งที่ฉันได้รับในลักษณะที่คลุมเครือชาญฉลาด ฉันไม่สามารถคาดเดาได้มากเกี่ยวกับการนำเข้าของฉันในแง่ของการจัดรูปแบบเช่นกรณีและช่องว่างที่ฝังตัว แต่นี่ไม่ใช่ข่าวร้าย ข่าวร้ายก็คือฉันต้องทำทุกอย่างในเกม RPG :-(

อย่างไรก็ตามฉันได้รวมฟังก์ชั่น Python เล็กน้อยเข้าด้วยกันเพื่ออธิบายความคิดของฉัน

ฉันใช้มันเพื่อประมวลผลรหัสไปรษณีย์สำหรับฉัน


1

เราได้รับสเป็ค:

รหัสไปรษณีย์ของสหราชอาณาจักรต้องอยู่ในรูปแบบใดรูปแบบหนึ่งต่อไปนี้ (ยกเว้นหนึ่งข้อยกเว้นดูด้านล่าง): 
    § A9 9AA 
    § A99 9AA
    § AA9 9AA
    § AA99 9AA
    § A9A 9AA
    § AA9A 9AA
โดยที่ A แทนอักขระตัวอักษรและ 9 แทนอักขระตัวเลข
กฎเพิ่มเติมนำไปใช้กับตัวอักษรดังนี้:
    character ตัวละครในตำแหน่งที่ 1 อาจไม่ใช่ Q, V หรือ X
    character ตัวละครในตำแหน่งที่ 2 อาจไม่ใช่ I, J หรือ Z
    character ตัวละครในตำแหน่งที่ 3 อาจไม่ใช่ I, L, M, N, O, P, Q, R, V, X, Y หรือ Z
    character ตัวละครในตำแหน่งที่ 4 อาจไม่ใช่ C, D, F, G, I, J, K, L, O, Q, S, T, U หรือ Z
    characters อักขระที่อยู่ในตำแหน่งที่ขวาสุดสองตำแหน่งอาจไม่ใช่ C, I, K, M, O หรือ V
ข้อยกเว้นเดียวที่ไม่เป็นไปตามกฎทั่วไปเหล่านี้คือรหัสไปรษณีย์ "GIR 0AA" ซึ่งเป็นรหัสไปรษณีย์ที่ถูกต้องเป็นพิเศษ

เรามากับสิ่งนี้:

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

ฉันมี regex สำหรับการตรวจสอบรหัสไปรษณีย์ของสหราชอาณาจักร

สิ่งนี้ใช้ได้กับรหัสไปรษณีย์ทุกประเภททั้งด้านในและด้านนอก

^((([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 --------------------> POSTCODE ด้านนอกเท่านั้น

A1 1AA ------------------> POSTCODE (ด้านนอกและภายใน) ของการรวมกัน

WC2A --------------------> OUTER


1

คำตอบที่ได้รับการยอมรับนั้นสะท้อนให้เห็นถึงกฎที่กำหนดโดยรอยัลเมล์แม้ว่าจะมีการพิมพ์ผิดใน regex ดูเหมือนว่าพิมพ์ผิดนี้มีอยู่ในเว็บไซต์ gov.uk เช่นกัน (เหมือนอยู่ในหน้าเก็บถาวร XML)

ในรูปแบบ A9A 9AA กฎอนุญาตให้ใช้อักขระ P ในตำแหน่งที่สามในขณะที่ regex ไม่อนุญาตสิ่งนี้ regex ที่ถูกต้องจะเป็น:

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

การย่อผลลัพธ์ใน regex ต่อไปนี้ (ซึ่งใช้ไวยากรณ์ 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})

นอกจากนี้ยังมีช่องว่างเสริมระหว่างบล็อกแรกและบล็อกที่สอง


1

สิ่งที่ฉันได้พบในรูปแบบเกือบทั้งหมดและ regex จากการถ่ายโอนจำนวนมาก pdf และสิ่งที่อยู่ในเว็บไซต์วิกิพีเดียคือสิ่งนี้โดยเฉพาะสำหรับ regik วิกิพีเดียคือต้องมี ^ หลังจากแรก | (แถบแนวตั้ง) ฉันพบสิ่งนี้โดยการทดสอบ AA9A 9AA เพราะมิฉะนั้นการตรวจสอบรูปแบบสำหรับ A9A 9AA จะตรวจสอบความถูกต้อง สำหรับตัวอย่างการตรวจสอบ EC1D 1BB ซึ่งควรจะไม่ถูกต้องกลับมาใช้ได้เนื่องจาก C1D 1BB เป็นรูปแบบที่ถูกต้อง

นี่คือสิ่งที่ฉันเกิดขึ้นสำหรับ regex ที่ดี:

^([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_Kingdom#Validationนี่คือเวอร์ชันของ Python regex ที่แยกวิเคราะห์และตรวจสอบรหัสไปรษณีย์ในสหราชอาณาจักรอย่างถูกต้อง:

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

regex นี้ง่ายและมีกลุ่มการจับกุม มันไม่ได้รวมการตรวจสอบความถูกต้องของรหัสไปรษณีย์ตามกฎหมายของสหราชอาณาจักรทั้งหมด แต่ต้องคำนึงถึงตำแหน่งตัวอักษรและตัวเลขเท่านั้น

นี่คือวิธีที่ฉันจะใช้ในรหัส:

@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

ฉันต้องการเวอร์ชันที่จะทำงานใน 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;

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!"}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.