Saya mengejar regex yang akan memvalidasi kode pos UK lengkap yang kompleks hanya dalam string input. Semua bentuk kode pos yang tidak umum harus dicakup sebagaimana biasa. Misalnya:
Cocok
- CW3 9SS
- SE5 0EG
- SE50EG
- se5 0eg
- WC2H 7LT
Tidak cocok
- aWC2H 7LT
- WC2H 7LTa
- WC2H
Bagaimana saya mengatasi masalah ini?
regex
validation
regex-group
postal-code
Kieran Benton
sumber
sumber
Jawaban:
Saya akan merekomendasikan untuk melihat Standar Data Pemerintah Inggris untuk kode pos [tautan sekarang mati; arsip XML , lihat Wikipedia untuk diskusi]. Ada deskripsi singkat tentang data dan skema xml terlampir menyediakan ekspresi reguler. Ini mungkin bukan apa yang Anda inginkan tetapi akan menjadi titik awal yang baik. RegEx sedikit berbeda dari XML, karena karakter P di posisi ketiga dalam format A9A 9AA diizinkan oleh definisi yang diberikan.
RegEx yang disediakan oleh Pemerintah Inggris adalah:
Seperti yang ditunjukkan pada diskusi Wikipedia, ini akan memungkinkan beberapa kode pos non-nyata (misalnya yang memulai AA, ZY) dan mereka memberikan tes yang lebih ketat yang bisa Anda coba.
sumber
^([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})$
Sepertinya kita akan menggunakan
^(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})$
, yang merupakan versi sedikit dimodifikasi yang disarankan oleh Minglis di atas.Namun, kami harus menyelidiki dengan tepat apa aturannya, karena berbagai solusi yang tercantum di atas tampaknya menerapkan aturan berbeda tentang surat mana yang diizinkan.
Setelah beberapa penelitian, kami telah menemukan beberapa informasi lebih lanjut. Rupanya halaman di 'govtalk.gov.uk' mengarahkan Anda ke spesifikasi kode pos govtalk-postcodes . Ini menunjuk ke skema XML di XML Schema yang menyediakan pernyataan 'pseudo regex' dari aturan kode pos.
Kami telah mengambilnya dan mengerjakannya sedikit untuk memberi kami ungkapan berikut:
Ini menjadikan spasi opsional, tetapi membatasi Anda ke satu spasi (ganti '&' dengan '{0,} untuk spasi tak terbatas). Itu mengasumsikan semua teks harus huruf besar.
Jika Anda ingin mengizinkan huruf kecil, dengan sejumlah spasi, gunakan:
Ini tidak mencakup wilayah luar negeri dan hanya memberlakukan format, BUKAN keberadaan berbagai wilayah. Ini didasarkan pada aturan berikut:
Dapat menerima format berikut:
Dimana:
Semoga sukses
Colin
sumber
^(([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}))$
{0,}
memilih bukan*
untuk ruang opsional tanpa batas?Saya baru-baru diposting jawaban untuk pertanyaan ini pada kode pos Inggris untuk bahasa R . Saya menemukan bahwa pola regex Pemerintah Inggris salah dan gagal dengan benar memvalidasi beberapa kode pos. Sayangnya, banyak jawaban di sini didasarkan pada pola yang salah ini.
Saya akan menguraikan beberapa masalah di bawah ini dan memberikan ekspresi reguler yang direvisi yang benar - benar berfungsi.
Catatan
Jawaban saya (dan ekspresi reguler secara umum):
Jika Anda tidak peduli dengan regex yang buruk dan hanya ingin melewatkan jawaban, gulir ke bawah ke bagian Jawab .
Regex Buruk
Ekspresi reguler di bagian ini tidak boleh digunakan.
Ini adalah regex yang gagal yang disediakan oleh pemerintah Inggris untuk pengembang (tidak yakin berapa lama tautan ini akan naik, tetapi Anda dapat melihatnya di dokumentasi Transfer Data Massal mereka ):
Masalah
Masalah 1 - Salin / Tempel
Lihat regex yang digunakan di sini .
Seperti yang mungkin dilakukan banyak pengembang, mereka menyalin / menempelkan kode (terutama ekspresi reguler) dan menempelnya agar mereka berfungsi. Walaupun ini bagus secara teori, ia gagal dalam kasus khusus ini karena menyalin / menempel dari dokumen ini sebenarnya mengubah salah satu karakter (spasi) menjadi karakter baris baru seperti yang ditunjukkan di bawah ini:
Hal pertama yang akan dilakukan kebanyakan pengembang adalah menghapus baris baru tanpa berpikir dua kali. Sekarang regex tidak akan cocok dengan kode pos dengan spasi di dalamnya (selain
GIR 0AA
kode pos).Untuk memperbaiki masalah ini, karakter baris baru harus diganti dengan karakter spasi:
Masalah 2 - Batas
Lihat regex yang digunakan di sini .
Kode pos regex secara tidak patut jangkar regex. Siapa pun yang menggunakan regex ini untuk memvalidasi kode pos mungkin akan terkejut jika nilainya seperti
fooA11 1AA
melewati. Itu karena mereka telah meletakkan awal opsi pertama dan akhir opsi kedua (terlepas dari satu sama lain), sebagaimana ditunjukkan dalam regex di atas.Ini artinya
^
(menegaskan posisi di awal baris) hanya berfungsi pada opsi pertama([Gg][Ii][Rr] 0[Aa]{2})
, jadi opsi kedua akan memvalidasi string apa pun yang berakhir dengan kode pos (terlepas dari apa yang datang sebelumnya).Demikian pula, opsi pertama tidak berlabuh ke akhir baris
$
, jadiGIR 0AAfoo
juga diterima.Untuk memperbaiki masalah ini, kedua opsi harus dibungkus dalam kelompok lain (atau kelompok yang tidak menangkap) dan jangkar ditempatkan di sekitarnya:
Masalah 3 - Set Karakter Tidak Benar
Lihat regex yang digunakan di sini .
Regex tidak ada di
-
sini untuk menunjukkan serangkaian karakter. Seperti berdiri, jika kode pos dalam formatANA NAA
(di manaA
mewakili huruf danN
mewakili angka), dan itu dimulai dengan apa pun selainA
atauZ
, itu akan gagal.Itu berarti akan cocok
A1A 1AA
danZ1A 1AA
, tetapi tidakB1A 1AA
.Untuk memperbaiki masalah ini, karakter
-
harus ditempatkan di antaraA
danZ
di set karakter masing-masing:Masalah 4 - Set Karakter Opsional Salah
Lihat regex yang digunakan di sini .
Saya bersumpah mereka bahkan tidak menguji hal ini sebelum mempublikasikannya di web. Mereka membuat set karakter yang salah menjadi opsional. Mereka membuat
[0-9]
opsi di sub-opsi keempat opsi 2 (grup 9). Ini memungkinkan regex untuk mencocokkan kode pos yang salah diformat sepertiAAA 1AA
.Untuk memperbaiki masalah ini, buat kelas karakter selanjutnya sebagai opsional (dan kemudian buat pasangan yang
[0-9]
cocok persis sekali):Masalah 5 - Kinerja
Kinerja pada regex ini sangat buruk. Pertama, mereka menempatkan opsi pola yang paling tidak cocok untuk dicocokkan
GIR 0AA
di awal. Berapa banyak pengguna yang mungkin memiliki kode pos ini dibandingkan dengan kode pos lainnya; mungkin tidak pernah? Ini berarti setiap kali regex digunakan, ia harus menghabiskan opsi ini terlebih dahulu sebelum melanjutkan ke opsi berikutnya. Untuk melihat bagaimana kinerja terpengaruh, periksa jumlah langkah yang diambil regex asli (35) terhadap regex yang sama setelah membalik opsi (22).Masalah kedua dengan kinerja adalah karena cara seluruh regex terstruktur. Tidak ada gunanya menelusuri kembali setiap opsi jika ada yang gagal. Cara regex saat ini disusun dapat sangat disederhanakan. Saya memberikan perbaikan untuk ini di bagian Jawaban .
Masalah 6 - Spasi
Lihat regex yang digunakan di sini
Ini mungkin tidak dianggap sebagai masalah , tetapi itu menimbulkan kekhawatiran bagi sebagian besar pengembang. Spasi di regex tidak opsional, yang berarti pengguna memasukkan kode pos mereka harus menempatkan spasi di kode pos. Ini adalah perbaikan yang mudah dengan hanya menambahkan
?
setelah spasi untuk menjadikannya opsional. Lihat bagian Jawaban untuk perbaikan.Menjawab
1. Memperbaiki Regex Pemerintah Inggris
Memperbaiki semua masalah yang diuraikan di bagian Masalah dan menyederhanakan pola menghasilkan pola berikut, lebih pendek, lebih ringkas. Kami juga dapat menghapus sebagian besar grup karena kami memvalidasi kode pos secara keseluruhan (bukan bagian individual):
Lihat regex yang digunakan di sini
Ini lebih lanjut dapat dipersingkat dengan menghapus semua rentang dari salah satu kasus (huruf besar atau kecil) dan menggunakan bendera case-insensitive. Catatan : Beberapa bahasa tidak memiliki satu, jadi gunakan yang lebih panjang di atas. Setiap bahasa mengimplementasikan flag ketidaksensitifan kasus secara berbeda.
Lihat regex yang digunakan di sini .
Lebih pendek lagi menggantikan
[0-9]
dengan\d
(jika mesin regex Anda mendukungnya):Lihat regex yang digunakan di sini .
2. Pola Sederhana
Tanpa memastikan karakter alfabet tertentu, berikut ini dapat digunakan (perlu diingat penyederhanaan dari 1. Memperbaiki Regex Pemerintah Inggris juga telah diterapkan di sini):
Lihat regex yang digunakan di sini .
Dan lebih jauh lagi jika Anda tidak peduli dengan kasus khusus
GIR 0AA
:3. Pola rumit
Saya tidak akan menyarankan verifikasi kode pos yang berlebih karena Area, Distrik, dan Sub-distrik baru dapat muncul kapan saja. Apa yang akan saya sarankan berpotensi melakukan, ditambahkan dukungan untuk tepi-kasus. Beberapa kasus khusus ada dan diuraikan dalam artikel Wikipedia ini .
Berikut adalah regex kompleks yang mencakup sub-bagian 3. (3.1, 3.2, 3.3).
Sehubungan dengan pola dalam 1. Memperbaiki Regex Pemerintah Inggris :
Lihat regex yang digunakan di sini
Dan terkait dengan 2. Pola Sederhana :
Lihat regex yang digunakan di sini
3.1 Wilayah Luar Negeri Britania
Artikel Wikipedia saat ini menyatakan (beberapa format sedikit disederhanakan):
AI-1111
: AnguilaASCN 1ZZ
: Pulau AscensionSTHL 1ZZ
: Saint HelenaTDCU 1ZZ
: Tristan da CunhaBBND 1ZZ
: Wilayah Samudra Hindia BritaniaBIQQ 1ZZ
: Wilayah Antartika BritaniaFIQQ 1ZZ
: Kepulauan FalklandGX11 1ZZ
: GibraltarPCRN 1ZZ
: Kepulauan PitcairnSIQQ 1ZZ
: Georgia Selatan dan Kepulauan Sandwich SelatanTKCA 1ZZ
: Kepulauan Turks dan CaicosBFPO 11
: Akrotiri dan DhekeliaZZ 11
&GE CX
: Bermuda (sesuai dengan dokumen ini )KY1-1111
: Kepulauan Cayman (menurut dokumen ini )VG1111
: Kepulauan Virgin Britania Raya (menurut dokumen ini )MSR 1111
: Montserrat (menurut dokumen ini )Regex yang mencakup semua untuk mencocokkan hanya Wilayah Luar Negeri Inggris yang akan terlihat seperti ini:
Lihat regex yang digunakan di sini .
3.2 Kantor Pos Pasukan Inggris
Meskipun mereka baru-baru ini mengubahnya untuk menyelaraskan dengan sistem kode pos Inggris lebih baik
BF#
(di mana#
mewakili angka), mereka dianggap sebagai kode pos alternatif opsional . Kode pos ini mengikuti (ed) formatBFPO
, diikuti oleh 1-4 digit:Lihat regex yang digunakan di sini
3.3 Santa?
Ada kasus khusus lain dengan Santa (seperti yang disebutkan dalam jawaban lain):
SAN TA1
adalah kode pos yang valid. Regex untuk ini sangat sederhana:sumber
Tidak ada yang namanya ekspresi reguler kode pos UK komprehensif yang mampu memvalidasi kode pos. Anda dapat memeriksa bahwa kode pos dalam format yang benar menggunakan ekspresi reguler; tidak benar-benar ada.
Kode pos sewenang-wenang kompleks dan terus berubah. Misalnya, outcode
W1
tidak, dan mungkin tidak pernah, memiliki setiap angka antara 1 dan 99, untuk setiap area kode pos.Anda tidak bisa berharap apa yang ada saat ini benar selamanya. Sebagai contoh, pada tahun 1990, Kantor Pos memutuskan bahwa Aberdeen menjadi agak ramai. Mereka menambahkan 0 di akhir AB1-5 sehingga AB10-50 dan kemudian membuat sejumlah kode pos di antaranya.
Setiap kali jalan baru dibangun, kode pos baru dibuat. Itu bagian dari proses untuk mendapatkan izin untuk membangun; otoritas lokal berkewajiban untuk memperbaharui ini dengan Kantor Pos (bukan berarti mereka semua melakukannya).
Selain itu, seperti dicatat oleh sejumlah pengguna lain, ada kode pos khusus seperti Girobank, GIR 0AA, dan satu untuk surat ke Santa, SAN TA1 - Anda mungkin tidak ingin memposting apa pun di sana tetapi tampaknya tidak dicakup oleh jawaban lain.
Lalu, ada kode pos BFPO, yang sekarang berubah ke format yang lebih standar . Kedua format akan valid. Terakhir, ada sumber teritori Wikipedia di luar negeri .
Selanjutnya, Anda harus mempertimbangkan bahwa Inggris "mengekspor" sistem kode posnya ke banyak tempat di dunia. Apa pun yang memvalidasi kode pos "Inggris" juga akan memvalidasi kode pos dari sejumlah negara lain.
Jika Anda ingin memvalidasi kode pos UK, cara teraman untuk melakukannya adalah dengan menggunakan kode pos saat ini. Ada sejumlah opsi:
Ordnance Survey merilis Code-Point Open di bawah lisensi data terbuka. Ini akan sangat sedikit ketinggalan zaman tetapi gratis. Ini akan (mungkin - saya tidak ingat) tidak termasuk data Irlandia Utara karena Survei persenjataan tidak memiliki kewenangan di sana. Pemetaan di Irlandia Utara dilakukan oleh Ordnance Survey di Irlandia Utara dan mereka memiliki produk Pointer yang terpisah dan dibayar . Anda dapat menggunakan ini dan menambahkan beberapa yang tidak tercakup dengan cukup mudah.
Royal Mail merilis File Alamat Kode Pos (PAF) , ini termasuk BFPO yang saya tidak yakin Code-Point Open tidak. Ini diperbarui secara teratur tetapi membutuhkan biaya (dan mereka kadang-kadang bisa sangat kejam tentangnya). PAF menyertakan alamat lengkap bukan hanya kode pos dan dilengkapi dengan Panduan Programmernya sendiri . Grup Pengguna Data Terbuka (ODUG) saat ini sedang melobi agar PAF dirilis secara gratis, berikut ini adalah deskripsi posisi mereka .
Terakhir, ada AddressBase . Ini adalah kolaborasi antara Ordnance Survey, Otoritas Lokal, Royal Mail dan perusahaan yang cocok untuk membuat direktori definitif semua informasi tentang semua alamat UK (mereka sudah cukup sukses juga). Dibayar-untuk tetapi jika Anda bekerja dengan Otoritas Lokal, departemen pemerintah, atau layanan pemerintah gratis untuk digunakan. Ada banyak informasi lebih dari sekadar kode pos yang disertakan.
sumber
Saya telah melihat beberapa jawaban di atas dan saya akan merekomendasikan untuk tidak menggunakan pola dari jawaban @ Dan (c. 15 Des '10) , karena salah menandai hampir 0,4% dari kode pos yang valid sebagai tidak valid, sementara yang lain tidak .
Ordnance Survey menyediakan layanan yang disebut Code Point Open yang:
Saya menjalankan masing-masing regex di atas terhadap daftar lengkap kode pos (6 Juli '13) dari data ini menggunakan
grep
:Ada total 1.686.202 kode pos.
Berikut ini adalah jumlah kode pos yang valid yang tidak cocok dengan masing-masing
$pattern
:Tentu saja, hasil ini hanya berurusan dengan kode pos yang valid yang salah ditandai sebagai tidak valid. Begitu:
Saya tidak mengatakan apa pun tentang pola mana yang terbaik untuk memfilter kode pos yang tidak valid.
sumber
http://regexlib.com/REDetails.aspx?regexp_id=260
sumber
0-9
, yang Anda tidak bisaMenurut tabel Wikipedia ini
Pola ini mencakup semua kasing
Saat menggunakannya di Android \ Java use \\ d
sumber
Sebagian besar jawaban di sini tidak berfungsi untuk semua kode pos yang saya miliki di database saya. Saya akhirnya menemukan satu yang sesuai dengan semuanya, menggunakan regex baru yang disediakan oleh pemerintah:
https://www.gov.uk/government/uploads/system/uploads/attachment_data/file/413338/Bulk_Data_Transfer_-_additional_validation_valid_from_March_2015.pdf
Itu tidak ada dalam jawaban sebelumnya, jadi saya mempostingnya di sini kalau-kalau mereka mengambil tautan:
UPDATE: Regex Diperbarui seperti yang ditunjukkan oleh Jamie Bull. Tidak yakin apakah itu penyalinan kesalahan saya atau kesalahan dalam regex pemerintah, tautannya turun sekarang ...
UPDATE: Seperti ctwheels ditemukan, regex ini berfungsi dengan rasa javascript regex. Lihat komentarnya untuk salah satu yang bekerja dengan rasa pcre (php).
sumber
^([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})$
harus^([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})$
- tempat perbedaan ;-)([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})
(dihapus^
dan$
dan menambahkan?
spasi setelah) untuk regexr.com untuk menemukan lebih dari satu hasil dan untuk keduanya untuk menemukan hasil yang tidak memiliki pemisah ruang.(?:)
dan kemudian jangkar ditempatkan di sekitarnya. Lihat gagal di sini . Untuk informasi lebih lanjut, lihat jawaban saya di sini .^(?:([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}))$
adalah ekspresi reguler yang diperbaiki.Posting lama tetapi masih cukup tinggi di hasil google jadi saya pikir saya akan memperbarui. Doc 14 Oktober ini mendefinisikan ekspresi reguler kode pos UK sebagai:
dari:
https://www.gov.uk/government/uploads/system/uploads/attachment_data/file/359448/4__Bulk_Data_Transfer_-_additional_validation_valid.pdf
Dokumen itu juga menjelaskan logika di baliknya. Namun, ia memiliki kesalahan (tebal) dan juga memungkinkan huruf kecil, yang meskipun legal tidak biasa, jadi versi yang diubah:
Ini berfungsi dengan kode pos London baru (mis. W1D 5LH) yang versi sebelumnya tidak.
sumber
(?:)
dan kemudian jangkar ditempatkan di sekitarnya. Lihat gagal di sini . Untuk informasi lebih lanjut, lihat jawaban saya di sini .^(?:([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}))$
adalah ekspresi reguler yang diperbaiki.Ini adalah regex yang dilayani Google di domain i18napis.appspot.com mereka :
sumber
Kode pos dapat berubah, dan satu-satunya cara yang benar untuk memvalidasi kode pos adalah memiliki daftar kode pos yang lengkap dan melihat apakah ada.
Tetapi ekspresi reguler bermanfaat karena:
Tetapi ekspresi reguler cenderung sulit untuk dipertahankan, terutama untuk seseorang yang tidak memunculkannya sejak awal. Jadi itu pasti:
Itu berarti bahwa sebagian besar ekspresi reguler dalam jawaban ini tidak cukup baik. Misalnya saya dapat melihat bahwa
[A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRV-Y]
akan mencocokkan area kode pos dari bentuk AA1A - tetapi akan terasa sakit di leher jika dan ketika area kode pos baru ditambahkan, karena sulit untuk memahami area kode pos mana yang cocok.Saya juga ingin persamaan reguler saya cocok dengan bagian pertama dan kedua dari kode pos sebagai pencocokan tanda kurung.
Jadi saya datang dengan ini:
Dalam format PCRE dapat ditulis sebagai berikut:
Bagi saya ini adalah keseimbangan yang tepat antara memvalidasi sebanyak mungkin, sementara pada saat yang sama pemeriksaan kedepan dan memungkinkan pemeliharaan yang mudah.
sumber
aSW1A 1AAasfg
cocok untuk saya (saya tidak downvote meskipun sepertinya itu bisa diperbaiki dengan mudah)Saya telah mencari regex kode pos Inggris untuk hari terakhir atau lebih dan tersandung pada utas ini. Saya bekerja melalui sebagian besar saran di atas dan tidak ada yang bekerja untuk saya, jadi saya membuat regex sendiri yang, sejauh yang saya tahu, menangkap semua kode pos Inggris yang valid pada Januari '13 (menurut literatur terbaru dari Royal Mail).
Regex dan beberapa kode pos sederhana memeriksa kode PHP diposting di bawah ini. CATATAN: - Hal ini memungkinkan untuk kode pos lebih rendah atau huruf besar dan anomali GIR 0AA tetapi untuk menangani, lebih dari kemungkinan, adanya ruang di tengah kode pos yang dimasukkan itu juga menggunakan str_replace sederhana untuk menghapus ruang sebelum pengujian melawan regex. Perbedaan apa pun di luar itu dan Royal Mail sendiri bahkan tidak menyebutkannya dalam literatur mereka (lihat http://www.royalmail.com/sites/default/files/docs/pdf/programmers_guide_edition_7_v5.pdf dan mulai membaca dari halaman 17) !
Catatan: Dalam literatur Royal Mail sendiri (tautan di atas) ada sedikit ambiguitas seputar posisi ke-3 dan ke-4 dan pengecualian di tempat jika karakter ini adalah huruf. Saya menghubungi Royal Mail secara langsung untuk menjernihkannya dan dengan kata-kata mereka sendiri "Sebuah surat di posisi ke-4 Kode Outward dengan format AANA NAA tidak memiliki pengecualian dan pengecualian posisi ke-3 hanya berlaku untuk huruf terakhir dari Kode Outward dengan format ANA NAA. " Langsung dari mulut kuda!
Saya harap ini membantu orang lain yang menemukan utas ini mencari solusi.
sumber
SW1A
atauBD25
tanpa babak kedua (atau setidaknya itu untuk saya)Berikut adalah regex berdasarkan format yang ditentukan dalam dokumen yang ditautkan dengan jawaban marcj:
Satu-satunya perbedaan antara itu dan spesifikasi adalah bahwa 2 karakter terakhir tidak boleh dalam [CIKMOV] sesuai dengan spesifikasi.
Sunting: Ini versi lain yang menguji batasan karakter yang tertinggal.
sumber
A-Z
-Q
tidak pernah diizinkan,V
hanya digunakan dengan hemat, dll. Tergantung pada posisi karakter.Beberapa regex di atas sedikit membatasi. Catat kode pos asli: "W1K 7AA" akan gagal mengingat aturan "Posisi 3 - AEHMNPRTVXY hanya menggunakan" di atas karena "K" akan dianulir.
regex:
Tampaknya sedikit lebih akurat, lihat artikel Wikipedia yang berjudul 'Kode Pos di Inggris' .
Perhatikan bahwa regex ini hanya membutuhkan karakter huruf besar.
Pertanyaan yang lebih besar adalah apakah Anda membatasi input pengguna untuk mengizinkan hanya kode pos yang benar-benar ada atau apakah Anda hanya mencoba untuk menghentikan pengguna memasukkan sampah lengkap ke bidang formulir. Mencocokkan setiap kode pos yang mungkin dengan benar, dan membuktikannya di masa mendatang, adalah teka-teki yang lebih sulit, dan mungkin tidak sepadan kecuali Anda adalah HMRC.
sumber
inilah cara kami menangani masalah kode pos UK:
Penjelasan:
Ini mendapatkan sebagian besar format, kami kemudian menggunakan db untuk memvalidasi apakah kode pos itu benar-benar nyata, data ini didorong oleh openpoint https://www.ordnancesurvey.co.uk/opendatadownload/products.html
semoga ini membantu
sumber
AANNA NAA
, yang tidak valid.Aturan dasar:
Kode pos di Inggris (atau kode pos, demikian sebutannya) terdiri dari lima hingga tujuh karakter alfanumerik yang dipisahkan oleh spasi. Aturan yang mencakup karakter mana yang dapat muncul pada posisi tertentu agak rumit dan penuh dengan pengecualian. Ekspresi reguler yang baru saja ditampilkan oleh karena itu tetap berpegang pada aturan dasar.
Aturan lengkap:
Jika Anda memerlukan regex yang mencentang semua kotak untuk aturan kode pos dengan mengorbankan keterbacaan, ini dia:
Sumber: https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9781449327453/ch04s16.html
Diuji terhadap basis data pelanggan kami dan tampaknya sangat akurat.
sumber
Saya menggunakan regex berikut yang telah saya uji terhadap semua kode pos Inggris yang valid. Ini didasarkan pada aturan yang direkomendasikan, tetapi diringkas sebanyak yang masuk akal dan tidak menggunakan aturan regex khusus bahasa khusus.
Itu mengasumsikan bahwa kode pos telah dikonversi ke huruf besar dan belum mengarah atau mengekor karakter, tetapi akan menerima ruang opsional antara kode keluar dan masuk.
Kode pos "GIR0 0AA" khusus dikecualikan dan tidak akan divalidasi karena tidak ada dalam daftar kode pos resmi Kantor Pos dan sejauh yang saya ketahui tidak akan digunakan sebagai alamat terdaftar. Menambahkannya harus sepele sebagai kasus khusus jika diperlukan.
sumber
Saya ingin regex sederhana, di mana boleh saja membiarkan terlalu banyak, tetapi tidak menyangkal kode pos yang valid. Aku pergi dengan ini (inputnya adalah string dilucuti / dipangkas):
Ini memungkinkan kode pos terpendek seperti "L1 8JQ" serta yang terpanjang seperti "OL14 5ET".
Karena memungkinkan hingga 8 karakter, itu juga akan memungkinkan kode pos 8 karakter yang salah jika tidak ada ruang: "OL145ETX". Tetapi sekali lagi, ini adalah regex sederhana, karena saat itu sudah cukup baik.
sumber
Paruh pertama dari kode pos Format yang valid
Pengecualian
Posisi 1 - QVX tidak digunakan
Posisi 2 - IJZ tidak digunakan kecuali di GIR 0AA
Posisi 3 - AEHMNPRTVXY hanya menggunakan
Posisi 4 - ABEHMNPRVWXY
Bagian kedua dari kode pos
Pengecualian
Posisi 2 + 3 - CIKMOV tidak digunakan
Ingat tidak semua kode yang mungkin digunakan, jadi daftar ini adalah kondisi yang diperlukan tetapi tidak mencukupi untuk kode yang valid. Mungkin lebih mudah untuk hanya mencocokkan dengan daftar semua kode yang valid?
sumber
Untuk memeriksa kode pos ada dalam format yang valid sesuai panduan pemrogram Royal Mail :
Semua kode pos pada doogal.co.uk cocok, kecuali yang tidak lagi digunakan.
Menambahkan
?
spasi setelahnya dan menggunakan kecocokan dengan huruf besar-kecil untuk menjawab pertanyaan ini:sumber
Yang ini memungkinkan ruang dan tab kosong dari kedua sisi jika Anda tidak ingin gagal validasi dan kemudian memotongnya.
sumber
AAA 1AA
bukan format yang valid: lihat jawaban saya untuk penjelasan dan perbaiki.Untuk menambahkan ke daftar ini, regex yang lebih praktis yang saya gunakan yang memungkinkan pengguna untuk memasukkan
empty string
adalah:Regex ini memungkinkan huruf kapital dan huruf kecil dengan ruang opsional di antaranya
Dari sudut pandang pengembang perangkat lunak regex ini berguna untuk perangkat lunak di mana alamat mungkin opsional. Misalnya, jika pengguna tidak ingin memberikan detail alamatnya
sumber
Lihatlah kode python di halaman ini:
http://www.brunningonline.net/simon/blog/archives/001292.html
Saya telah menggunakannya untuk memproses kode pos untuk saya.
sumber
Kami diberi spec:
Kami datang dengan ini:
Tetapi perhatikan - ini memungkinkan sejumlah ruang di antara kelompok.
sumber
Saya memiliki regex untuk validasi Kode Pos UK.
Ini berfungsi untuk semua jenis kode pos baik di dalam maupun luar
Ini berfungsi untuk semua jenis format.
Contoh:
sumber
Jawaban yang diterima mencerminkan aturan yang diberikan oleh Royal Mail, meskipun ada kesalahan ketik pada regex. Kesalahan ketik ini tampaknya juga ada di situs gov.uk (seperti pada halaman arsip XML).
Dalam format A9A 9AA aturan memungkinkan karakter P di posisi ketiga, sementara regex tidak mengizinkannya. Regex yang benar adalah:
Memendekkan ini menghasilkan regex berikut (yang menggunakan sintaksis Perl / Ruby):
Ini juga termasuk ruang opsional antara blok pertama dan kedua.
sumber
Apa yang saya temukan di hampir semua variasi dan regex dari pdf transfer massal dan apa yang ada di situs wikipedia adalah ini, khusus untuk wikipedia regex, perlu ada ^ setelah yang pertama | (bilah vertikal). Saya menemukan ini dengan menguji AA9A 9AA, karena jika tidak, cek format untuk A9A 9AA akan memvalidasinya. Untuk Contoh memeriksa EC1D 1BB yang seharusnya tidak valid kembali valid karena C1D 1BB adalah format yang valid.
Inilah yang saya hasilkan untuk regex yang baik:
sumber
Melalui pengujian dan pengamatan empiris, serta mengonfirmasi dengan https://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom#Validation , ini adalah versi saya dari regex Python yang dengan benar mem-parsing dan memvalidasi kode pos Inggris:
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 ini sederhana dan memiliki kelompok penangkap. Ini tidak termasuk semua validasi kode pos UK legal , tetapi hanya memperhitungkan posisi huruf vs angka.
Inilah cara saya menggunakannya dalam kode:
Berikut ini adalah unit test:
sumber
Saya membutuhkan versi yang akan bekerja di SAS dengan
PRXMATCH
dan fungsi terkait, jadi saya datang dengan ini:Menguji kasus dan catatan:
sumber
Metode di bawah ini akan memeriksa kode pos dan memberikan info lengkap
sumber