ekspresi reguler untuk kode pos

118

Kemungkinan Duplikat:
Apa kode pos terakhir dan ekspresi reguler?

Saya membutuhkan Regex yang dapat memenuhi ketiga persyaratan saya untuk kode pos. Misalnya-

  1. 12345
  2. 12345-6789
  3. 12345 1234

Setiap petunjuk dan saran akan sangat dihargai. Terima kasih!

Shaitender Singh
sumber
4
Penutupan duplikat terlihat samar - penipu meminta regex yang akan cocok dengan kode pos mana pun dari negara mana pun, sedangkan pertanyaan ini meminta regex untuk mencocokkan kode pos, yang merupakan hal khusus AS, yang membuat pertanyaan ini banyak sempit dalam lingkup dari korban penipuan - tetapi ada adalah sebenarnya sebuah jawaban dapat ditemukan di dupe itu. Lihat stackoverflow.com/a/7185241/1709587 yang mencantumkan ekspresi reguler kode pos Unicode CLDR (lama, sekarang tidak digunakan lagi, tetapi mungkin masih memadai dalam banyak kasus) untuk> 100 negara, termasuk AS. Regex AS adalah \d{5}([ \-]\d{4})?.
Mark Amery

Jawaban:

310
^\d{5}(?:[-\s]\d{4})?$
  • ^ = Awal dari string.
  • \d{5} = Cocokkan 5 digit (untuk kondisi 1, 2, 3)
  • (?:…) = Pengelompokan
  • [-\s] = Cocokkan spasi (untuk kondisi 3) atau tanda hubung (untuk kondisi 2)
  • \d{4} = Cocokkan 4 digit (untuk kondisi 2, 3)
  • …? = Pola sebelumnya adalah opsional (untuk kondisi 1)
  • $ = Akhir dari string.
kennytm
sumber
7
\sakan cocok dengan semua spasi, termasuk tab dan baris baru.
Kelopak mata
1
Hai bagaimana dengan kondisi 123451234 tanpa ruang
Ajay Suwalka
4
@ProVega: Membaca komentar pada jawaban (sekarang dihapus) yang Anda tautkan, yang tampaknya salah. Misalnya, 00544adalah kode pos yang valid; 544tidak.
Keith Thompson
2
@AjaySuwalka: Yang harus Anda lakukan untuk mengakomodasi 123451234 tanpa ruang adalah tempat a? setelah [- \ s], jadi akan menjadi: ^ \ d {5} (?: [- \ s]? \ d {4})? $
Grungondola
6
Agak terlambat ke pesta, dan mungkin bukan bel tercantik di pesta, tapi saya telah menambahkan ruang opsional tambahan di kedua sisi tanda hubung - kebanyakan untuk estetika. /(^\d{5}(?:[\s]?[-\s][\s]?\d{4})?$)/
Birrel
4

Untuk tiga kondisi yang terdaftar saja, ekspresi ini mungkin juga berfungsi:

^\d{5}[-\s]?(?:\d{4})?$
^\[0-9]{5}[-\s]?(?:[0-9]{4})?$
^\[0-9]{5}[-\s]?(?:\d{4})?$
^\d{5}[-\s]?(?:[0-9]{4})?$

Silakan lihat demo ini untuk penjelasan tambahan.

Jika kami memiliki spasi tambahan yang tidak terduga antara 5 dan 4 digit atau kode pos 9 digit yang bersambung, seperti:

123451234
12345 1234
12345  1234

ekspresi ini misalnya akan menjadi opsi sekunder dengan lebih sedikit batasan:

^\d{5}([-]|\s*)?(\d{4})?$

Silakan lihat demo ini untuk penjelasan tambahan.

Sirkuit RegEx

jex.im memvisualisasikan ekspresi reguler:

masukkan deskripsi gambar di sini

Uji

const regex = /^\d{5}[-\s]?(?:\d{4})?$/gm;
const str = `12345
12345-6789
12345 1234
123451234
12345 1234
12345  1234
1234512341
123451`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

Emma
sumber
0

Saya tahu ini mungkin jelas bagi kebanyakan orang yang sering menggunakan RegEx, tetapi jika ada pembaca yang baru mengenal RegEx, saya pikir saya harus menunjukkan pengamatan yang saya buat yang berguna untuk salah satu proyek saya.

Dalam jawaban sebelumnya dari @kennytm:

^\d{5}(?:[-\s]\d{4})?$

…? = Pola sebelumnya adalah opsional (untuk kondisi 1)

Jika Anda ingin mengizinkan kode pos standar 5 digit dan +4, ini adalah contoh yang bagus.

Untuk hanya mencocokkan kode pos dalam format 'Zip + 4' AS seperti yang perlu saya lakukan (hanya kondisi 2 dan 3), cukup hapus yang terakhir ?sehingga akan selalu cocok dengan kelompok 5 karakter terakhir.

Alat yang berguna yang saya rekomendasikan untuk bermain-main dengan RegEx ditautkan di bawah ini:

https://regexr.com/

Saya sering menggunakan alat ini ketika saya menemukan RegEx yang melakukan sesuatu yang mirip dengan apa yang saya butuhkan, tetapi dapat disesuaikan sedikit lebih baik. Ini juga memiliki menu referensi RegEx bagus dan antarmuka informatif yang membuat Anda tetap sadar tentang bagaimana perubahan Anda memengaruhi kecocokan untuk teks contoh yang Anda masukkan.

Jika saya mendapatkan sesuatu yang salah atau melewatkan bagian informasi penting, mohon koreksi saya.

NjalTheKnut
sumber
atau Anda dapat merujuk tutorial regex ini - youtube.com/watch?v=8uCHRyK_VMo
Krishnraj Rana