regex สำหรับรหัสไปรษณีย์


118

อาจซ้ำกันได้:
รหัสไปรษณีย์และนิพจน์ทั่วไปที่ดีที่สุดคืออะไร?

ฉันต้องการ Regex ซึ่งสามารถตอบสนองเงื่อนไขทั้งสามประการของฉันสำหรับรหัสไปรษณีย์ เช่น-

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

คำแนะนำและข้อเสนอแนะใด ๆ จะได้รับการชื่นชมมาก ขอบคุณ!


4
การปิดซ้ำดูไม่สมบูรณ์ - ผู้หลอกลวงกำลังขอ regex ที่จะตรงกับรหัสไปรษณีย์จากประเทศใด ๆ ก็ตามในขณะที่คำถามนี้ขอให้ regex จับคู่รหัสไปรษณีย์ซึ่งเป็นสิ่งที่มีเฉพาะในสหรัฐฯเท่านั้นซึ่งทำให้คำถามนี้มีมาก อยู่ในขอบเขตที่แคบกว่าล่อ - แต่มีเป็นในความเป็นจริงคำตอบที่จะพบได้ที่ล่อ ดูstackoverflow.com/a/7185241/1709587ซึ่งแสดงรายการรหัสไปรษณีย์ของ Unicode CLDR (เก่าเลิกใช้งานแล้ว แต่อาจยังเพียงพอในหลาย ๆ กรณี) รหัสไปรษณีย์ regexes สำหรับ> 100 ประเทศรวมทั้งสหรัฐอเมริกา regex \d{5}([ \-]\d{4})?สหรัฐ
Mark Amery

คำตอบ:


311
^\d{5}(?:[-\s]\d{4})?$
  • ^ = จุดเริ่มต้นของสตริง
  • \d{5} = จับคู่ 5 หลัก (สำหรับเงื่อนไข 1, 2, 3)
  • (?:…) = การจัดกลุ่ม
  • [-\s] = จับคู่ช่องว่าง (สำหรับเงื่อนไข 3) หรือยัติภังค์ (สำหรับเงื่อนไข 2)
  • \d{4} = จับคู่ 4 หลัก (สำหรับเงื่อนไข 2, 3)
  • …? = รูปแบบก่อนที่จะเป็นทางเลือก (สำหรับเงื่อนไข 1)
  • $ = จุดสิ้นสุดของสตริง

7
\sจะตรงกับช่องว่างใด ๆ รวมถึงแท็บและบรรทัดใหม่
เปลือกตา

1
สวัสดีสภาพ 123451234 ไม่มีช่องว่าง
Ajay Suwalka

4
@ProVega: การอ่านความคิดเห็นเกี่ยวกับคำตอบ (ตอนนี้ถูกลบไปแล้ว) ที่คุณเชื่อมโยงซึ่งดูเหมือนจะไม่ถูกต้อง ตัวอย่างเช่น00544รหัสไปรษณีย์ที่ถูกต้อง 544ไม่ใช่.
Keith Thompson

2
@AjaySuwalka: สิ่งที่คุณต้องทำเพื่อรองรับ 123451234 โดยไม่มีที่ว่างคือวาง a? หลังจาก [- \ s] ดังนั้นมันจะกลายเป็น: ^ \ d {5} (?: [- \ s]? \ d {4})? $
Grungondola

6
ไปงานปาร์ตี้สายเล็กน้อยและอาจจะไม่ใช่เสียงระฆังที่สวยที่สุดที่ลูกบอล แต่ฉันได้เพิ่มช่องว่างเพิ่มเติมที่ด้านใดด้านหนึ่งของยัติภังค์ - ส่วนใหญ่เพื่อความสวยงาม /(^\d{5}(?:[\s]?[-\s][\s]?\d{4})?$)/
Birrel

4

สำหรับเงื่อนไขสามข้อที่แสดงรายการเท่านั้นนิพจน์เหล่านี้อาจใช้ได้:

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

โปรดดูการสาธิตนี้สำหรับคำอธิบายเพิ่มเติม

หากเรามีช่องว่างเพิ่มเติมที่ไม่คาดคิดระหว่าง 5 ถึง 4 หลักหรือรหัสไปรษณีย์ 9 หลักที่ต่อเนื่องกันเช่น:

123451234
12345 1234
12345  1234

ตัวอย่างเช่นนิพจน์นี้จะเป็นตัวเลือกรองที่มีข้อ จำกัด น้อยกว่า:

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

โปรดดูการสาธิตนี้สำหรับคำอธิบายเพิ่มเติม

วงจร RegEx

jex.imแสดงภาพนิพจน์ทั่วไป:

ใส่คำอธิบายภาพที่นี่

ทดสอบ

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


0

ฉันรู้ว่าสิ่งนี้อาจชัดเจนสำหรับคนส่วนใหญ่ที่ใช้ RegEx เป็นประจำ แต่ในกรณีที่ผู้อ่านยังใหม่กับ RegEx ฉันคิดว่าฉันควรชี้ให้เห็นข้อสังเกตที่ฉันทำซึ่งเป็นประโยชน์สำหรับหนึ่งในโครงการของฉัน

ในคำตอบก่อนหน้านี้จาก @kennytm:

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

... ? = รูปแบบก่อนที่จะเป็นทางเลือก (สำหรับเงื่อนไข 1)

หากคุณต้องการอนุญาตทั้ง 5 หลักมาตรฐานและรหัสไปรษณีย์ +4 นี่เป็นตัวอย่างที่ดี

หากต้องการจับคู่เฉพาะรหัสไปรษณีย์ในรูปแบบ 'Zip + 4' ของสหรัฐอเมริกาตามที่ฉันต้องการ (เงื่อนไข 2 และ 3 เท่านั้น) ให้ลบรหัสสุดท้ายออก?เพื่อให้ตรงกับกลุ่มอักขระ 5 ตัวสุดท้ายเสมอ

เครื่องมือที่มีประโยชน์ที่ฉันแนะนำสำหรับการซ่อมแซม RegEx มีลิงก์ด้านล่าง:

https://regexr.com/

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

หากฉันมีอะไรผิดพลาดหรือพลาดข้อมูลสำคัญโปรดแก้ไขฉัน


หรือคุณสามารถดูบทช่วยสอน regex - youtube.com/watch?v=8uCHRyK_VMo
Krishnraj Rana
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.