İngiltere Posta Kodları ile eşleşen RegEx


186

Ben sadece bir giriş dizesi içinde tam bir karmaşık İngiltere posta kodunu doğrulayacak bir regex sonra değilim. Yaygın olmayan tüm posta kodu formlarının her zamanki gibi kapsanması gerekir. Örneğin:

Maçlar

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

Eşleşme Yok

  • aWC2H 7LT
  • WC2H 7LTa
  • WC2H

Bu sorunu nasıl çözerim?


2
@axrwkr bu yararlı görünmüyor
Kieran Benton

8
İngiltere Posta Kodu Doğrulama - JavaScript ve PHP Geçerli posta kodlarıyla eşleşmek için kabul edilen cevabı alamadım ama bunu buldum ve geçerli posta kodlarıyla eşleşiyor. İstemci tarafı doğrulaması için JavaScript sürümü, sunucu tarafı doğrulaması için JavaScript'i C # olarak yeniden yazmak oldukça basittir. Hatta posta kodunu bir boşluğa sahip olacak şekilde yeniden biçimlendirir, bu nedenle W1A1AA olarak bir posta kodu girerseniz, doğrulamaya ek olarak W1A 1AA olarak yeniden biçimlendirir. Hatta çeşitli İngiliz bölgelerindeki olağandışı posta kodlarıyla bile ilgileniyor.

2
Sağlanan bağlantı "AA1A 1AA" biçimleri için çalışmıyor. Referans: dhl.com.tw/content/dam/downloads/tw/express/forms/…
Anthony Scaife

1
Sadece bir posta kodunu doğrulamak istiyorsanız, ücretsiz (kayıt gerekli) doğrulama REST API uç noktası sunuyoruz - developers.alliescomputing.com/postcoder-web-api/address-lookup/…
Stephen Keable

1
İyi soru. Eşleşmesi gereken nadir örnekler listenize "M1 3HZ" gibi merkezi bir Manchester posta kodunu dahil etmeye değer olacağını düşünüyorum. Birçok kişi 1 harf 1 sayı kombinasyonlarının farkında değildir.
Martin Joiner

Yanıtlar:


208

Posta kodları için Birleşik Krallık Hükümet Veri Standardına göz atmanızı tavsiye ederim [bağlantı artık ölü; XML arşivi, tartışma için Wikipedia'ya bakın ]. Veriler hakkında kısa bir açıklama vardır ve ekli xml şeması düzenli bir ifade sağlar. Tam olarak istediğiniz şey olmayabilir, ancak iyi bir başlangıç ​​noktası olacaktır. RegEx, XML'den biraz farklıdır, çünkü A9A 9AA biçimindeki üçüncü konumda bir P karakterine verilen tanım tarafından izin verilir.

İngiltere Hükümeti tarafından sağlanan 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})

Wikipedia tartışmasına da işaret edildiği gibi, bu bazı gerçek olmayan posta kodlarına izin verir (örneğin AA, ZY'yi başlatanlar) ve deneyebileceğiniz daha titiz bir test sağlarlar.


52
Ve bu reg, iki segment (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
Sayfaların her yıl sona ermesi nedeniyle gerçek
regex'i

7
Bu regex, diğer regex lezzetlerinden biraz farklı olan XML Şeması içindir
artbristol

6
JavaScript ile çalışmasını sağlayamıyorum. Sadece belirli regex motorlarıyla mı çalışır?
NickG

12
Aslında değiştirdiler: Toplu Veri Transferi :^([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

Biz kullanıyor olacağız gibi görünüyor ^(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})$yukarıda Minglis tarafından sugested bu biraz değiştirilmiş bir sürümü olan.

Bununla birlikte, yukarıda listelenen çeşitli çözümler, hangi harflere izin verildiğine ilişkin farklı kurallar uyguluyor gibi göründüğü için kuralların tam olarak ne olduğunu araştırmamız gerekecek.

Biraz araştırma yaptıktan sonra biraz daha bilgi bulduk. Görünüşe göre 'govtalk.gov.uk' sayfasındaki bir sayfa sizi govtalk-postcodes posta kodu spesifikasyonuna yönlendirir . Bu, XML Şeması'nda posta kodu kurallarının 'sözde regex' ifadesini sağlayan bir XML şemasına işaret eder .

Bunu aldık ve bize aşağıdaki ifadeyi vermek için biraz çalıştık:

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

Bu, boşlukları isteğe bağlı yapar, ancak sizi bir boşlukla sınırlar (sınırsız boşluklar için '&' yerine '{0,} yerine). Tüm metnin büyük harf olması gerektiğini varsayar.

Küçük harfe izin vermek istiyorsanız, istediğiniz sayıda boşlukla şunları kullanın:

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

Bu, denizaşırı bölgeleri kapsamaz ve sadece farklı alanların varlığını DEĞİL, biçimi uygular. Aşağıdaki kurallara dayanmaktadır:

Aşağıdaki biçimleri kabul edebilir:

  • “GIR 0AA”
  • A9 9ZZ
  • A99 9ZZ
  • AB9 9ZZ
  • AB99 9ZZ
  • A9C 9ZZ
  • AD9E 9ZZ

Nerede:

  • 9 herhangi bir rakam olabilir.
  • A, Q, V veya X dışında herhangi bir harf olabilir.
  • B, I, J veya Z dışında herhangi bir harf olabilir.
  • C, I, L, M, N, O, P, Q, R, V, X, Y veya Z dışında herhangi bir harf olabilir.
  • D, I, J veya Z dışında herhangi bir harf olabilir.
  • E, A, B, E, H, M, N, P, R, V, W, X veya Y'den herhangi biri olabilir.
  • Z, C, I, K, M, O veya V dışında herhangi bir harf olabilir.

En iyi dileklerimle

Colin


2
Büyük cevap, denizaşırı olanlara ekledim^(([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

Sınırsız, isteğe bağlı alanlar {0,}yerine neden belirtilsin *?
Code Animal

77

Geçenlerde yayınlanan bir cevap için R dili İngiltere posta kodları bu soruya . İngiltere Hükümeti'nin normal ifade modelinin yanlış olduğunu ve bazı posta kodlarını doğru bir şekilde doğrulayamadığını keşfettim . Ne yazık ki, buradaki cevapların çoğu bu yanlış kalıba dayanmaktadır.

Bu sorunlardan bazılarını aşağıda özetleyeceğim ve gerçekten işe yarayan düzeltilmiş düzenli bir ifade sunacağım .


Not

Cevabım (ve genel olarak düzenli ifadeler):

  • Yalnızca posta kodu biçimlerini doğrular .
  • Bir posta kodunun yasal olarak bulunmasını sağlamaz .
    • Bunun için uygun bir API kullanın! Daha fazla bilgi için Ben'in cevabına bakınız .

Kötü normal ifade ile ilgilenmiyorsanız ve sadece cevaba atlamak istiyorsanız, Cevap bölümüne ilerleyin .

Kötü Düzenleme

Bu bölümdeki normal ifadeler kullanılmamalıdır.

Bu, İngiltere hükümetinin geliştiricilere sağladığı başarısız regex'tir (bu bağlantının ne kadar süreceğini bilmiyorum, ancak Toplu Veri Aktarımı belgelerinde görebilirsiniz ):

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

sorunlar

Sorun 1 - Kopyala / Yapıştır

Kullanımdaki normal ifadeye bakın .

Birçok geliştiricinin yaptığı gibi, kodu kopyalar / yapıştırırlar (özellikle normal ifadeler) ve çalışmasını beklerken yapıştırırlar. Teoride bu harika olsa da, bu özel durumda başarısız olur, çünkü bu belgeden kopyala / yapıştır, aslında karakterlerden birini (boşluk) aşağıda gösterildiği gibi yeni satır karakterine dönüştürür:

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

Çoğu geliştiricinin yapacağı ilk şey, yeni satırı iki kez düşünmeden silmek. Şimdi normal ifade, posta kodlarını içindeki boşluklarla ( GIR 0AAposta kodu dışında) eşleştirmeyecektir .

Bu sorunu gidermek için, yeni satır karakteri boşluk karakteriyle değiştirilmelidir:

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

Problem 2 - Sınırlar

Kullanımdaki normal ifadeye bakın .

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

Posta kodu normal ifadesi normal ifadeyi yanlış bir şekilde sabitler. Posta kodlarını doğrulamak için bu normal ifadeyi kullanan herkes, böyle bir değer geçerse şaşırtabilir fooA11 1AA. Bunun nedeni, yukarıdaki seçeneğin de işaret ettiği gibi, ilk seçeneğin başlangıcını ve ikinci seçeneğin sonunu (birbirinden bağımsız olarak) demirlemiş olmalarıdır.

Bunun anlamı, ^(satırın başlangıcındaki konumu belirtir ) yalnızca ilk seçenek üzerinde çalışır ([Gg][Ii][Rr] 0[Aa]{2}), bu nedenle ikinci seçenek posta koduyla biten tüm dizeleri doğrular (daha önce ne olursa olsun).

Benzer şekilde, ilk seçenek satırın sonuna kadar demirlemiş değildir $bu yüzden, GIR 0AAfooaynı zamanda kabul edilir.

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

Bu sorunu gidermek için, her iki seçeneğin de başka bir gruba (veya yakalamayan gruba) sarılması ve bunun etrafına tutturulması gerekir:

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

Sorun 3 - Uygunsuz Karakter Kümesi

Kullanımdaki normal ifadeye bakın .

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

Normal ifade, -bir dizi karakteri belirtmek için burada eksik . Durduğu gibi, bir posta kodu biçimindedir ANA NAA(burada Abir harfi Ntemsil eder ve bir sayıyı temsil eder) ve Aveya dışında bir şeyle başlarsa Zbaşarısız olur.

Bunun anlamı o maç olacak A1A 1AAve Z1A 1AAancak B1A 1AA.

Bu sorunu gidermek için, karakter ilgili karakter kümesine ve -arasına yerleştirilmelidir :AZ

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

Sorun 4 - Yanlış İsteğe Bağlı Karakter Seti

Kullanımdaki normal ifadeye bakın .

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

Yemin ederim ki bu şeyi internette yayınlamadan önce test etmediler bile. Yanlış karakter setini isteğe bağlı yaptılar. [0-9]Seçenek 2'nin dördüncü alt seçeneğinde (grup 9) seçenek yaptılar . Bu, normal ifadenin yanlış biçimlendirilmiş posta kodlarıyla eşleşmesini sağlar AAA 1AA.

Bu sorunu gidermek için, bir sonraki karakter sınıfını isteğe bağlı yapın (ve daha sonra kümenin [0-9]tam olarak bir kez eşleşmesini sağlayın ):

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

Sorun 5 - Performans

Bu normal ifade üzerindeki performans son derece zayıf. İlk GIR 0AAbaşta, başlangıçta eşleşmesi en az olası desen seçeneğini yerleştirdiler . Diğer posta kodlarına kıyasla kaç kullanıcının bu posta koduna sahip olması muhtemeldir; muhtemelen asla? Bu, normal ifade her kullanıldığında, bir sonraki seçeneğe geçmeden önce bu seçeneğin tüketilmesi gerektiği anlamına gelir. Performansın nasıl etkilendiğini görmek için, orijinal normal ifadenin (35) seçenekleri (22) ters çevirdikten sonra aynı normal ifadeye karşı attığı adım sayısını kontrol edin .

Performansla ilgili ikinci sorun, tüm normal ifadenin yapılandırılma şeklidir. Başarısız olursa, her seçenek üzerinde geriye dönük izleme yoktur. Mevcut normal ifadenin yapılandırılma şekli büyük ölçüde basitleştirilebilir. Bunun için Yanıt bölümünde bir düzeltme sağlarım.

Problem 6 - Mekanlar

Kullanımdaki normal ifadeye bakın

Bu, kendi başına bir sorun olarak görülmeyebilir , ancak çoğu geliştirici için endişe yaratmaktadır. Normal ifadedeki boşluklar isteğe bağlı değildir, yani posta kodlarını giren kullanıcıların posta koduna boşluk bırakmaları gerekir. Bu, ?isteğe bağlı hale getirmek için boşluklardan sonra ekleyerek kolay bir düzeltmedir . Düzeltme için Yanıt bölümüne bakın .


Cevap

1. Birleşik Krallık Hükümetinin Regex'ini Düzeltmek

Sorunlar bölümünde ana hatlarıyla belirtilen tüm sorunların düzeltilmesi ve desenin basitleştirilmesi aşağıdaki, daha kısa ve daha özlü desen verir. Ayrıca, posta kodunu bir bütün olarak doğruladığımızdan (tek tek parçalar değil) grupların çoğunu kaldırabiliriz:

Kullanımdaki normal ifadeye bakın

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

Bu ayrıca, vakaların birinden (büyük veya küçük harf) tüm aralıkları kaldırarak ve büyük / küçük harfe duyarlı olmayan bir bayrak kullanarak kısaltılabilir. Not : Bazı dillerde bir dil yoktur, bu yüzden yukarıdaki uzun dili kullanın. Her dil büyük / küçük harf duyarsızlığı bayrağını farklı uygular.

Kullanımdaki normal ifadeye bakın .

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

Tekrar yerine kısa [0-9]olan \d(senin regex motoru destekliyorsa):

Kullanımdaki normal ifadeye bakın .

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

2. Basitleştirilmiş Desenler

Belirli alfabetik karakterler sağlanmadan aşağıdakiler kullanılabilir ( 1'deki basitleştirmeleri aklınızda bulundurun . İngiltere Hükümeti'nin Regex'inin düzeltilmesi de burada uygulanmıştır):

Kullanımdaki normal ifadeye bakın .

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

Ve özel durumu önemsemiyorsanız daha da fazlası GIR 0AA:

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

3. Karmaşık Desenler

Yeni Alanlar, İlçeler ve Alt ilçeler herhangi bir zamanda görünebileceğinden bir posta kodunun aşırı doğrulanmasını önermem. Potansiyel olarak ne yapacağımı önereceğim , kenar durumlarda destek eklendi. Bazı özel durumlar mevcuttur ve bu Wikipedia makalesinde ana hatlarıyla verilmiştir .

İşte 3 (3.1, 3.2, 3.3) alt bölümlerini içeren karmaşık düzenli ifadeler .

Düzenlere ilgili olarak İngiltere Hükümeti Regex Tespit 1. :

Kullanımdaki normal ifadeye bakın

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

Ve 2. ile ilgili olarak : Basitleştirilmiş Kalıplar :

Kullanımdaki normal ifadeye bakın

^(([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 İngiliz Denizaşırı Toprakları

Wikipedia makalesinde şu anda belirtiliyor (bazı biçimler biraz basitleştirilmiş):

  • AI-1111: Anguila
  • ASCN 1ZZ: Yükselme adası
  • STHL 1ZZ: Saint Helena
  • TDCU 1ZZ: Tristan da Cunha
  • BBND 1ZZ: Britanya Hint Okyanusu Toprakları
  • BIQQ 1ZZ: Britanya Antarktika Bölgesi
  • FIQQ 1ZZ: Falkland adaları
  • GX11 1ZZ: Cebelitarık
  • PCRN 1ZZ: Pitcairn Adaları
  • SIQQ 1ZZ: Güney Georgia ve Güney Sandwich Adaları
  • TKCA 1ZZ: Turks ve Caicos Adaları
  • BFPO 11: Akrotiri ve Dhekelia
  • ZZ 11& GE CX: Bermuda ( bu belgeye göre )
  • KY1-1111: Cayman Adaları ( bu belgeye göre )
  • VG1111: İngiliz Virgin Adaları ( bu belgeye göre )
  • MSR 1111: Montserrat ( bu belgeye göre )

Yalnızca İngiliz Denizaşırı Toprakları ile eşleşecek her şeyi kapsayan bir normal ifade şöyle görünebilir:

Kullanımdaki normal ifadeye bakın .

^((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 İngiliz Kuvvetleri Postanesi

Son zamanlarda İngiliz posta kodu sistemiyle BF#( #bir sayıyı temsil eder) daha iyi hizalanacak şekilde değiştirilmelerine rağmen , isteğe bağlı alternatif posta kodları olarak kabul edilirler . Bu posta kodları BFPO, ardından 1-4 basamak biçimini izler (düzenler) :

Kullanımdaki normal ifadeye bakın

^BFPO ?\d{1,4}$

3.3 Noel Baba?

Noel Baba ile başka bir özel durum daha var (diğer cevaplarda belirtildiği gibi): SAN TA1geçerli bir posta kodu. Bunun için bir normal ifade çok basittir:

^SAN ?TA1$

4
Basitleştirilmiş desenler kullanmak için gerçekten iyi bir seçenektir. Daha sonra herhangi bir değişiklikle güncellendiğinden emin olmanız gerektiğinde veya çok kızgın kullanıcılarınız olabileceğinden, bir regex ile çok kısıtlayıcı olmamak en iyisidir. Açık hataları gidermek için basitleştirilmiş bir normal ifadeyle gevşek bir şekilde eşleşmenin ve daha sonra geçerliliği doğrulamak için adres araması (veya e-posta düzenli ifadesinde onay e-postası) gibi başka kontroller uygulamak daha iyi hissediyorum.
James Coyle

2
Mükemmel ve kapsamlı analiz.
Steve

1
Birçok seviyede parlak cevap. Nihayetinde, 2. basitleştirilmiş deseninizle gittim. Aslında tüm İngiltere posta kodları ile bir DB var gibi, ben sadece bir adres dizesi potansiyel olarak geçerli bir posta kodu içerip içermediğini görmek için bir ilk geçiş gerekir, bu yüzden (gerçek arama onları kök salmak gibi) yanlış pozitif umurumda değil , ama yanlış negatifleri önemsiyorum. Ve hız da önemlidir.
John Powell

Birleşik Krallık posta kodu sisteminde, bilgisayar çağından önce komite tarafından açıkça oluşturulmuş çok fazla sorun var, ancak değişken uzunluk ve boşluk sorunu en zararlılardan biri. E1 5JX'den E1 5JX'e kadar postalama kodları da dahil olmak üzere her türlü dehşet gördüm, yani, üç boşlukla, böylece Excel'deki SW18 5HA ile güzelce hizalanıyor (adresleri yönetmek için korkunç derecede uygunsuz yazılım ekleyin). Tek aklı başında çözüm olan IMHO, posta boşluklarının Elastik, Solr, Postgres, vb. Yakınında herhangi bir yere ulaşmadan önce tek bir dize olmasını sağlamaktır
John Powell

45

Bir posta kodunu doğrulayabilen kapsamlı bir İngiltere posta kodu normal ifadesi diye bir şey yoktur . Normal bir ifade kullanarak posta kodunun doğru biçimde olup olmadığını kontrol edebilirsiniz; aslında var olmadığı için değil.

Posta kodları keyfi olarak karmaşıktır ve sürekli değişmektedir. Örneğin, outcode W1her posta kodu alanı için 1 ile 99 arasında her sayıya sahip değildir ve hiçbir zaman olmayabilir.

Şu anda orada olanların sonsuza kadar doğru olmasını bekleyemezsiniz. Örnek olarak, 1990 yılında Postane Aberdeen'in biraz kalabalıklaşmasına karar verdi. AB1-5'in sonuna 0 ekleyerek AB10-50 yaptılar ve sonra bunlar arasında bir dizi posta kodu oluşturdular.

Ne zaman yeni bir sokak inşa edilirse, yeni bir posta kodu oluşturulur. İnşa etme izni alma sürecinin bir parçası; yerel makamlar postaneyle güncel tutmakla yükümlüdür (hepsinin yaptığı gibi değil).

Ayrıca, bir dizi diğer kullanıcı tarafından belirtildiği gibi, Girobank, GIR 0AA ve Santa, SAN TA1'e mektuplar için olan özel posta kodları var - muhtemelen orada hiçbir şey göndermek istemiyorsunuz, ancak görünmüyor başka bir cevapla kapsanmak.

Ardından, şimdi daha standart bir biçime dönüşen BFPO posta kodları var . Her iki biçim de geçerli olacak. Son olarak, yurtdışı toprakları kaynak Wikipedia var .

+ ---------- + -------------------------------------- -------- +
| Posta kodu | Yerleşim |
+ ---------- + -------------------------------------- -------- +
| AI-2640 | Anguilla |
| ASCN 1ZZ | Yükseliş Adası |
| STHL 1ZZ | Saint Helena |
| TDCU 1ZZ | Tristan da Cunha |
| BBND 1ZZ | Britanya Hint Okyanusu Toprakları |
| BIQQ 1ZZ | Britanya Antarktika Bölgesi |
| FIQQ 1ZZ | Falkland Adaları |
| GX11 1AA | Cebelitarık |
| PCRN 1ZZ | Pitcairn Adaları |
| SIQQ 1ZZ | Güney Georgia ve Güney Sandwich Adaları |
| TKCA 1ZZ | Turks ve Caicos Adaları |
+ ---------- + -------------------------------------- -------- +

Daha sonra, İngiltere'nin posta kodu sistemini dünyanın birçok yerine "ihraç ettiğini" dikkate almalısınız. "İngiltere" posta kodunu doğrulayan her şey, diğer bazı ülkelerin posta kodlarını da doğrular.

Bir İngiltere posta kodunu doğrulamak istiyorsanız, bunu yapmanın en güvenli yolu geçerli posta kodlarını aramaktır. Birkaç seçenek vardır:

  • Ordnance Survey, Code-Point Open'ı açık bir veri lisansı altında yayınladı Zamanın çok az arkasında olacak ama ücretsiz. Ordnance Survey'in burada hiçbir görevi olmadığından bu (muhtemelen - hatırlayamıyorum) Kuzey İrlanda verilerini içermeyecektir. Kuzey İrlanda'da haritalama, Kuzey İrlanda Ordnance Survey tarafından yürütülür ve ayrı, ödenmiş Pointer ürünlerine sahiptir. Bunu kullanabilir ve oldukça kolay kapsanmayan birkaçını ekleyebilirsiniz.

  • Royal Mail, Posta Kodu Adres Dosyasını (PAF) yayınlar, buna Code-Point Open'dan emin olmadığım BFPO dahildir. Düzenli olarak güncellenir, ancak maliyetlidir (ve bazen bu konuda düpedüz anlamına gelebilir). PAF sadece posta kodları yerine tam adresi içerir ve kendi Programcı Kılavuzu ile birlikte gelir . Açık Veri Kullanıcı Grubu (ODUG) şu anda PAF'ın ücretsiz olarak yayınlanması için lobi yapıyor, işte konumlarının açıklaması .

  • Son olarak, AddressBase var . Bu, Ordnance Survey, Local Authorities, Royal Mail ve eşleşen bir şirket arasında, tüm İngiltere adresleriyle ilgili tüm bilgilerin kesin bir dizinini oluşturmak için yapılan bir işbirliğidir (oldukça başarılı oldular). Ücretlidir, ancak bir Yerel Makam, devlet dairesi veya devlet hizmetiyle çalışıyorsanız, kullanmaları ücretsizdir. Sadece posta kodlarından çok daha fazla bilgi var.


ilginç görünüyor
SuperUberDuper

2
op'un aradığı cevap bu olmasa da, muhtemelen en faydalı olanıdır. Bu, yapacağım kontrol kurallarını gevşetmem için beni teşvik edecek.
John Hunt

22

Yukarıdaki cevapların bazılarına bir göz attım ve @ Dan'ın cevabındaki (c. 15 Aralık '10) kalıbı kullanmaya karşı öneriyorum , çünkü geçerli posta kodlarının neredeyse% 0.4'ünü geçersiz olarak yanlış olarak işaretlerken, diğerleri değil .

Ordnance Survey, Code Point Open adlı ve aşağıdakileri sağlayan bir hizmet sunar:

İngiltere'deki mevcut tüm posta kodu birimlerinin listesini içerir

Yukarıdaki regexs her biri kullanarak bu verilerden posta kodları (Temmuz 6 '13) tam listesine karşı koştu 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"

Toplam 1.686.202 posta kodu vardır.

Aşağıdaki do geçerli semtleri arasındaki sayılardır değil her maç $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

Elbette bu sonuçlar yalnızca geçersiz olarak yanlış olarak işaretlenmiş geçerli posta kodlarıyla ilgilidir. Yani:

'^.*$'
# => 0

Geçersiz posta kodlarını filtreleme konusunda hangi desenin en iyi olduğu hakkında hiçbir şey söylemiyorum.


1
Cevabımda söylediğim bu değil mi ve eğer dayanıklı rotadan aşağı gidiyorsanız muhtemelen hepsini yapmalı ve birisi cevabını değiştirirse güncel tutmalısınız? Değilse, en azından aldığınız cevabın son düzenleme tarihine bakın, böylece insanlar o zamandan beri değiştirilip değiştirilmediğini görebilir.
Ben

Doğru tespit. Buna göre düzenlendi. Bu kalıpların çoğunun CPO kodlarından herhangi birini dışlamadığını, ancak en çok oylanan (geçerli normal ifade) cevabının işaret ettiğini tartışmaya eklediğini düşünüyorum. Gelecekteki okuyucular: sonuçlarımın güncelliğini yitireceğini unutmayın.
RichardTowers

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

Geçerli İngiltere posta kodlarıyla eşleşecek düzenli ifade. Birleşik Krallık posta sisteminde tüm mektuplar her pozisyonda kullanılmaz (araç plakalarıyla aynıdır) ve bunu yönetmek için çeşitli kurallar vardır. Bu normal ifade bu kuralları dikkate almaktadır. Kuralların ayrıntıları: Posta kodunun ilk yarısı Geçerli biçimler [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] İstisnalar Konum - İlk. Kısıtlama - QVX kullanılmıyor Konum - İkinci. Contraint - GIR 0AA Pozisyonu - Üçüncü hariç IJZ kullanılmaz. Kısıtlama - AEHMNPRTVXY yalnızca Konum - İleri'yi kullandı. Contraint - ABEHMNPRVWXY Posta kodunun ikinci yarısı Geçerli biçimler [0-9] [AZ] [AZ] İstisnalar Konum - İkinci ve Üçüncü. Kısıtlama - CIKMOV kullanılmıyor

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


1
İnsanların neden bu cevabı düşürdüğünü bilmiyorum - doğru regex
Ollie

Normal ifade Javscript'teki "YO31" ve "YO31 1" posta kodları için çalışmaz.
Pratik Khadloya

9
Bunun doğru olduğunu düşünmüyorum, çünkü verilen regex açıklamayla çelişiyor ve başlayacağınız posta kodlarına sahip 0-9olabileceğinizi gösteriyor - yapamazsınız
Luigi Plinge

4
Bu normal ifade yaklaşık 6000 geçerli posta kodunda başarısız oluyor, bu yüzden buna karşı öneriyorum. Cevabımı gör .
RichardTowers

bu küçük harfle veya benim için bir boşluk olmadan herhangi bir posta kodu başarısız
Dancer

14

Bu Wikipedia tablosuna göre

resim açıklamasını buraya girin

Bu desen tüm vakaları kapsar

(?:[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 üzerinde kullanırken \\ d kullanın


Ben gov.uk web sitesinden bilgi almak çözümlere göre gerçek geçerli kodları yerine, sadece bir posta kodu biçimini arar rağmen, bu en okunabilir cevap bulundu, ama bu benim kullanım durumum için yeterince iyi. Onunla biraz oynadıktan sonra (python'da), biraz daha kompakt ama eşdeğer bir regex'e çarptım, bu da isteğe bağlı bir alana izin verir: ([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

Buradaki cevapların çoğu veritabanımdaki tüm posta kodları için işe yaramadı. Sonunda, hükümetin sağladığı yeni regex'i kullanarak herkesi doğrulayan bir tane buldum:

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

Önceki yanıtların hiçbirinde değil, bu yüzden bağlantıyı aşağı indirmeleri durumunda buraya gönderiyorum:

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

GÜNCELLEME: Jamie Bull'un işaret ettiği şekilde normal ifade güncellendi. Kopyalamanın benim hatam olup olmadığından veya hükümetin normal ifadesinde bir hata olup olmadığından emin değilim, bağlantı şimdi kapalı ...

GÜNCELLEME: Ctwheels'ın bulduğu gibi, bu normal ifade javascript normal ifade aroması ile çalışır. Pcre (php) aroması ile çalışan bir yorumuna bakınız.


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})$olmalı ^([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})$- farkı bulun ;-)
Jamie Bull

1
Bulun! Cevabım güncellendi. Teşekkürler!
Jesús Carrera

2
Burada regexr.com ve Notepad ++ ile çalışan tek cevap budur . Rağmen, regexr.com birden fazla sonuç bulmak ve her ikisi için bir boşluk ayırıcı olmayan bir sonuç bulmak için ([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})(kaldırıldı ^ve boşluk sonra $bir ekledi) değiştirmek zorunda kaldı . ?
mythofechelon

@ctwheels bu normal ifade javascript aroması içindir. Eğer başarısız bağlantınız javascript'i seçerseniz çalışır. Bu harika bir şey ve cevabımı güncelleyeceğim.
Jesús Carrera

1
Belgelerde yayınlanan normal ifade doğası gereği yanlıştır. Tüm ifade yakalamayan bir gruba sarılmalı (?:)ve daha sonra çevresine tutturulmalıdır. Bak burada başarısız . Daha fazla bilgi için cevabımı buraya bakın . ^(?:([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}))$düzeltilmiş düzenli ifadedir.
ctwheels

12

Eski bir yazı ama yine de google sonuçlarında oldukça yüksek güncelleme güncelledim düşündüm. 14 Ekim tarihli bu doküman İngiltere posta kodu normal ifadesini şu şekilde tanımlar:

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

dan:

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

Belge ayrıca arkasındaki mantığı açıklar. Ancak, bir hata var (kalın) ve ayrıca yasal olağan olmasa da, değiştirilmiş sürüm olan küçük harfe izin verir:

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

Bu, önceki sürümlerin kullanmadığı yeni Londra posta kodlarıyla (örneğin W1D 5LH) çalışır.


Kalın harflerle vurguladığınız hata belgede düzeltilmiş gibi görünüyor, ancak yine de okunması daha kolay olduğu için normal ifadenizi tercih ediyorum.
programlama profesörü

5
Söyleyeceğim tek şey, alanı \ s olarak değiştirerek alanı isteğe bağlı yapmak mı? alan okunabilirlik için bir gereklilik olmadığından.
programlama profesörü

Belgelerde yayınlanan normal ifade doğası gereği yanlıştır. Tüm ifade yakalamayan bir gruba sarılmalı (?:)ve daha sonra çevresine tutturulmalıdır. Bak burada başarısız . Daha fazla bilgi için cevabımı buraya bakın . ^(?:([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}))$düzeltilmiş düzenli ifadedir.
ctwheels

10

Bu, Google'ın i18napis.appspot.com alan adında sunduğu normal ifade :

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

Posta kodları değişebilir ve posta kodunu doğrulamanın tek gerçek yolu posta kodlarının tam listesine sahip olmak ve orada olup olmadığına bakmaktır.

Ancak düzenli ifadeler yararlıdır çünkü:

  • kullanımı ve uygulaması kolaydır
  • kısa
  • koşmak hızlı
  • bakımı oldukça kolaydır (posta kodlarının tam listesine kıyasla)
  • hala çoğu girdi hatasını yakala

Ancak düzenli ifadelerin sürdürülmesi zor, özellikle de ilk başta gelmeyen biri için. Yani şöyle olmalı:

  • mümkün olduğunca kolay anlaşılır
  • nispeten gelecek kanıtı

Bu, bu yanıttaki düzenli ifadelerin çoğunun yeterince iyi olmadığı anlamına gelir. Örneğin [A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRV-Y], bunun AA1A formunun bir posta kodu alanıyla eşleşeceğini görebiliyorum - ancak yeni bir posta kodu alanı eklendiğinde ve eklenirse boyunda bir ağrı olacak, çünkü hangi posta kodu alanlarıyla eşleştiğini anlamak zor.

Ayrıca normal ifademin parantezli eşleşmeler olarak posta kodunun ilk ve ikinci yarısıyla eşleşmesini istiyorum.

Ben de bununla geldim:

(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 formatında şu şekilde yazılabilir:

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

Benim için bu mümkün olduğu kadar valide etme ve aynı zamanda gelecekteki prova ve kolay bakıma izin verme arasındaki doğru dengedir.


Neden oy kullandığınızdan emin değilim - bu, attığım tüm geçerli posta kodları ve yukarıdaki cevapların çoğunun doğru işlemediği alanlarla çalışır. Nedenini açıklamak ister mi?
Jon

1
@Jon Ayrıca, diğer karakterlerin başlangıç ​​veya bitişe eklendiğinde eşleşir, örneğin aSW1A 1AAasfgbenim için eşleşti (Kolayca düzeltilebiliyormuş gibi olsa da
aşağı düşmedim

9

Ben son gün için bir İngiltere posta kodu regex arıyordum ve bu iş parçacığında tökezledi. Yukarıdaki önerilerin çoğunda yoluma devam ettim ve hiçbiri benim için işe yaramadı, bu yüzden bildiğim kadarıyla, Ocak 13'ten itibaren geçerli tüm İngiltere posta kodlarını yakalayan kendi regex'imle geldim (en son literatüre göre) Kraliyet Postası).

Normal ifade ve bazı basit posta kodu kontrol PHP kodu aşağıda yayınlanmıştır. NOT: - Küçük veya büyük harfli posta kodları ve GIR 0AA anomalisine izin verir, ancak girilen posta kodunun ortasında bir alanın varlığından daha büyük bir olasılıkla başa çıkmak için aynı zamanda testten önce alanı kaldırmak için basit bir str_replace kullanır normal ifadeye karşı. Bunun ötesinde herhangi bir tutarsızlık ve Kraliyet Postası kendileri literatürlerinde bile bahsetmiyorlar (bkz. Http://www.royalmail.com/sites/default/files/docs/pdf/programmers_guide_edition_7_v5.pdf ve sayfa 17'den okumaya başlayın) !

Not: Royal Mail'in kendi literatüründe (yukarıdaki bağlantı) 3. ve 4. pozisyonları çevreleyen hafif bir belirsizlik ve bu karakterler harf ise istisnalar vardır. Temizlemek ve kendi sözleriyle doğrudan Royal Mail ile temasa geçtim. ANA NAA biçiminde. " Doğrudan atın ağzından!

<?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>";

    }

?>

Umarım çözüm arayan bu iş parçacığına rastlayan herkese yardımcı olur.


1
Hangi örnek posta kodlarının yayınlanan örneği başarısız olduğunu bilmek ister miydim?
Zhaph - Ben Duguid

Size belirli bir posta kodu veremiyorum (tam PAF listesine erişmeden) ancak ANA NAA formatına sahip posta kodları, P ve Q harflerine 3. konumda izin verildiğinden ve AANA NAA formatına sahip posta kodları potansiyel olarak başarısız olacağından potansiyel olarak başarısız olur 4. pozisyon tüm harflere izin verdiği için başarısız olur (yukarıdaki cevapta verilen normal ifade bunlardan hiçbirini dikkate almaz). Dediğim gibi, sadece Royal Mail'in şu anki tavsiyesine gidiyorum - yukarıdaki cevap sırasında, belki de normal ifade tamamen uyumluydu.
Dan Solo

Başınız için teşekkürler - "P" nin üçüncü pozisyonda kabul edilebilir olarak eklendiğini görüyorum (bağlantılı dokümanınızdan), ancak Q değil - ama "4. pozisyon tüm harflere izin veriyor" nerede okuyorsunuz? Doktor görebildiğim kadarıyla "dördüncü pozisyon" dan bahsetmiyor, bu yüzden bunu "gerçek pozisyondan bağımsız olarak üçüncü harf" olarak okurdum.
Zhaph - Ben Duguid

1
Royal Mail destek ekibinden yeni sözler aldım ve kuralları yorumlamam doğru. Dış Kod'un 4. konumundaki bir harfin (örn. AANA NAA) istisnası yoktur ve 3. pozisyon istisnaları sadece son harf için geçerlidir (örneğin ANA NAA). Atın ağzından.
Dan Solo

1
@DanSolo Bu normal ifade, geçerli bir posta kodunun ilk yarısı için, iç kodu eksik SW1Aveya BD25ikinci yarı olmadan (veya en azından benim için yaptı)
gerçek bir eşleşme döndürür

7

İşte marcj'nin cevabına bağlı belgelerde belirtilen formata dayalı bir regex:

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

Bu ve spesifikasyonlar arasındaki tek fark, spesifikasyonlara göre son 2 karakterin [CIKMOV] 'da olamayacağıdır.

Düzenleme: İşte sondaki karakter sınırlamalarını test eden başka bir sürüm.

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

Bir İngiliz posta kodunda kabul etmekten çok daha fazla karmaşıklık vardır A-Z- Qasla izin verilmez, Vkarakterin konumuna bağlı olarak sadece az miktarda kullanılır.
Zhaph - Ben Duguid

2
İstediğiniz bir sözdizimi denetimi ise bu ilgisiz olabilir. Diğerlerinin de belirttiği gibi, sadece güncel bir veritabanındaki bir arama neredeyse doğru olur ve o zaman bile veritabanının ne kadar güncel olduğu sorunu vardır. Yani benim için bu sözdizimi denetleyicisi normal ifadesi açık, basit ve kullanışlıdır.
Rick-777

5

Yukarıdaki normal ifadelerden bazıları biraz kısıtlayıcıdır. Orijinal posta kodu: "W1K 7AA" kuralı başarısız olursa, "Konum 3 - Yalnızca yukarıdaki" K "olarak kullanılan AEHMNPRTVXY'ye izin verilmez.

normal ifade:

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

Biraz daha doğru görünüyor, 'İngiltere'de posta kodları' başlıklı Wikipedia makalesine bakın .

Bu normal ifadenin yalnızca büyük harfli karakterler gerektirdiğini unutmayın.

Daha büyük soru, kullanıcı girişini yalnızca gerçekten var olan posta kodlarına izin verecek şekilde kısıtlayıp kısıtlamadığınız veya kullanıcıların form alanlarına tam çöp girmesini durdurmaya çalışıp çalışmadığınızdır. Olası her posta kodunu doğru bir şekilde eşleştirmek ve gelecekte prova yapmak daha zor bir bulmaca ve HMRC değilseniz muhtemelen buna değmez.


Postane devam ediyor gibi görünüyor, ancak hükümet biraz geride kaldı :(
Zhaph - Ben Duguid

4
Bunu kullanıyorum: "^ ([Gg] [Ii [Rr] 0 [Aa] {2}) | ((([A-Za-z] [0-9] {1,2}) | (( [A-Za-z] [A-Ha-HJ-Yj-il] [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}) $ "Üst ve alt vakalara izin verdiği ve alanı isteğe bağlı kıldığı için beğendim -% 100 doğru değilse, kullanılabilirlik için daha iyi!
bigtv

4

İngiltere posta kodu sorununu şu şekilde ele alıyoruz:

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

Açıklama:

  • 1 veya 2 az karakter bekliyoruz, üst veya alt para cezası
  • 1 veya 2 sayı bekliyoruz
  • 0 veya 1 az karakter, üst veya alt para cezası bekle
  • isteğe bağlı alan
  • 1 numara bekle
  • 2 az, üst veya alt para cezası bekle

Bu, çoğu biçimi alır, daha sonra posta kodunun gerçekten gerçek olup olmadığını doğrulamak için db'yi kullanırız, bu veriler https://www.ordnancesurvey.co.uk/opendatadownload/products.html tarafından yönlendirilir.

Bu yardımcı olur umarım


Bu AANNA NAAgeçersiz biçime izin verir .
ctwheels

Bu nedenle cevabın 'Bu çoğu formatı alır' kısmı. :)
Alex Stephens

4

Temel kurallar:

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

İngiltere'deki posta kodları (veya çağrıldıklarında posta kodları), boşlukla ayrılmış beş ila yedi alfasayısal karakterden oluşur. Belirli karakterlerde hangi karakterlerin görünebileceğini kapsayan kurallar oldukça karmaşıktır ve istisnalarla doludur. Bu nedenle, gösterilen düzenli ifade temel kurallara bağlıdır.

Kuralların tamamı:

Okunabilirlik pahasına posta kodu kuralları için tüm kutuları işaretleyen bir regex'e ihtiyacınız varsa, işte burada:

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

Kaynak: https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9781449327453/ch04s16.html

Müşteriler veritabanına karşı test edildi ve mükemmel bir şekilde doğru görünüyor.


4

Tüm geçerli İngiltere posta kodlarına karşı test ettiğim aşağıdaki normal ifadeyi kullanıyorum. Önerilen kurallara dayanır, ancak makul olduğu kadar yoğunlaştırılır ve özel dile özgü normal regex kurallarını kullanmaz.

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

Posta kodunun büyük harfe dönüştürüldüğünü ve önde gelen veya sondaki karakterlerin bulunmadığını, ancak outcode ve incode arasında isteğe bağlı bir boşluk kabul edeceğini varsayar.

Özel "GIR0 0AA" posta kodu hariçtir ve resmi Postane posta kodları listesinde olmadığı ve bildiğim kadarıyla kayıtlı adres olarak kullanılmayacağı için geçerli olmayacaktır. Gerekirse eklenmesi özel bir durum olarak önemsiz olmalıdır.


4

Çok fazla izin vermek, ancak geçerli bir posta kodunu reddetmemenin iyi olduğu basit bir regex istedim. Bu ile gitti (giriş sökülen / kesilmiş dize):

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

Bu, "L1 8JQ" gibi mümkün olan en kısa posta kodlarına ve "OL14 5ET" gibi en uzun posta kodlarına izin verir.

8 karaktere kadar izin verdiği için, boşluk yoksa 8 karakterli posta kodlarına da izin verir: "OL145ETX". Ama yine de, bu yeterince iyi olduğunda basit bir regex.


Özür dilerim. Sanırım dün test ederken / i'yi kaçırdım.
John

3

Posta kodunun ilk yarısı Geçerli biçimler

  • [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]

İstisnalar
Konum 1 - QVX kullanılmıyor
Konum 2 - IJZ, GIR 0AA
Konum 3 dışında kullanılmaz - AEHMNPRTVXY yalnızca kullanılan
Konum 4 - ABEHMNPRVWXY

Posta kodunun ikinci yarısı

  • [0-9] [az] [az]

İstisnalar
Konum 2 + 3 - CIKMOV kullanılmıyor

Olası tüm kodların kullanılmadığını unutmayın, bu nedenle bu liste geçerli bir kod için gerekli ancak yeterli olmayan bir durumdur. Tüm geçerli kodların bir listesiyle eşleştirmek daha kolay olabilir mi?


3

Bir posta kodunu kontrol etmek için Royal Mail'in programcı kılavuzuna göre geçerli bir formatta olması gerekir :

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

Artık kullanılmayanlar hariç , doogal.co.uk adresindeki tüm posta kodları eşleşir.

?Bu soruyu cevaplamak için boşluk sonra bir ekleme ve büyük / küçük harfe duyarlı olmayan eşleme kullanma:

'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

Bu, doğrulama işleminde başarısız olmak istemezseniz ve ardından ciddi tarafı kırpmak istemiyorsanız, her iki taraftan da boş alanlara ve sekmelere izin verir.

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

Bu, orijinal soru
MattjeS

Bu İngiltere hükümetinin bozuk düzenli ifadesi ve geçerli biçimlerin bazılarını doğrulayamıyor.
ctwheels

@ctwheels Merhaba, lütfen başarısız bir posta kodu sağlayabilir misiniz, teşekkürler.
Matas Vaitkevicius

Örneğin AAA 1AA, geçerli bir biçim değildir: bkz cevabımı bir açıklama ve düzeltme için.
ctwheels

2

Bu listeye eklemek için kullanacağım daha pratik bir regex kullanıcı girmek için izin verir 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}))$

Bu normal ifade, aralarında isteğe bağlı boşluk bulunan büyük ve küçük harflere izin verir

Yazılım geliştiricileri açısından bu normal ifade, bir adresin isteğe bağlı olabileceği yazılımlar için kullanışlıdır. Örneğin, bir kullanıcı adres ayrıntılarını vermek istemiyorsa


1

Bu sayfadaki python koduna bir göz atın:

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

Yapmam gereken bazı posta kodu ayrıştırma var. Gereksinim oldukça basit; Bir posta kodunu bir outcode ve (isteğe bağlı) incode ayrıştırmak zorunda. İyi olan şu ki, herhangi bir onaylama yapmak zorunda değilim. Biçimlendirme, yani büyük / küçük harf ve gömülü boşluklar anlamında içe aktarımım hakkında fazla bir şey düşünemiyorum. Ama bu kötü haber değil; Kötü haber ise hepsini RPG'de yapmak zorunda olduğum. :-(

Yine de düşüncemi açıklığa kavuşturmak için küçük bir Python işlevi attım.

Bunu benim için posta kodlarını işlemek için kullandım.


1

Bize bir spec verildi:

İngiltere posta kodları aşağıdaki biçimlerden birinde olmalıdır (bir istisna dışında aşağıya bakın): 
    § A9 9AA 
    § A99 9AA
    § AA9 9AA
    § AA99 9AA
    § A9A 9AA
    § AA9A 9AA
burada A alfabetik bir karakteri ve 9 sayısal bir karakteri temsil eder.
Alfabetik karakterler için aşağıdaki gibi ek kurallar geçerlidir:
    § Konum 1'deki karakter Q, V veya X olamaz
    § 2. konumdaki karakter I, J veya Z olamaz
    § 3. konumdaki karakter I, L, M, N, O, P, Q, R, V, X, Y veya Z olamaz
    § 4. konumdaki karakter C, D, F, G, I, J, K, L, O, Q, S, T, U veya Z olamaz
    § En sağdaki iki konumdaki karakterler C, I, K, M, O veya V olamaz
Bu genel kurallara uymayan tek istisna, özel geçerli bir posta kodu olan "GIR 0AA" posta kodudur.

Biz bununla geldik:

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

Ancak not - bu, gruplar arasında herhangi bir sayıda boşluğa izin verir.


2
paulslater19, maalesef çözümünüz A99A 9AA posta kodlarına izin verir.

1

İngiltere posta kodu doğrulaması için regex var.

Bu, iç veya dış her türlü Posta Kodu için çalışıyor

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

Bu, tüm format türleri için çalışır.

Misal:

AB10 --------------------> SADECE DIŞ POSTA KODU

A1 1AA ------------------> (DIŞ VE İÇ) POSTKODUN KOMBİNASYONU

WC2A --------------------> DIŞ


1

Normal cevapta bir yazım hatası olmasına rağmen, kabul edilen cevap Royal Mail tarafından verilen kuralları yansıtır. Bu yazım hatası, gov.uk sitesinde de (XML arşiv sayfasında olduğu gibi) orada görünmektedir.

A9A 9AA formatında kurallar üçüncü konumda bir P karakterine izin verirken, normal ifade buna izin vermiyor. Doğru normal ifade şöyle olur:

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

Bunun kısaltılması aşağıdaki normal ifadeyle sonuçlanır (Perl / Ruby sözdizimini kullanır):

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

Ayrıca birinci ve ikinci blok arasında isteğe bağlı bir boşluk içerir.


1

Ne neredeyse tüm varyasyonlarda bulduk ve toplu transfer pdf regex ve wikipedia sitesinde ne olduğunu, özellikle wikipedia regex için, ilk | (dikey çubuk) sonra bir ^ olması gerekir. Bunu AA9A 9AA'yı test ederek anladım, aksi takdirde A9A 9AA için biçim kontrolü bunu doğrulayacaktır. Örneğin, geçersiz olması gereken EC1D 1BB kontrolü, C1D 1BB geçerli bir format olduğundan geçerli olur.

İşte iyi bir regex için geldim:

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

Ampirik test ve gözlemin yanı sıra, https://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom#Validation ile , bir İngiltere posta kodunu doğru bir şekilde ayrıştıran ve doğrulayan bir Python regex sürümüm:

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

Bu normal ifade basittir ve yakalama gruplarına sahiptir. O değil bir doğrulamaları tüm dahil yasal UK posta kodları, ama sadece hesaba sayı pozisyonları vs mektup alır.

İşte nasıl kodda kullanmak istiyorsunuz:

@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

Birim testleri şunlardır:

@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 ile PRXMATCHve ilgili işlevlerle çalışacak bir sürüme ihtiyacım vardı , bu yüzden bu ile geldim:

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

Test senaryoları ve notlar:

/* 
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

Aşağıdaki yöntem posta kodunu kontrol edecek ve tam bilgi sağlayacaktır

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!"}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.