regex cho mã zip


118

Có thể trùng lặp:
Mã bưu chính cuối cùng và zip regex là gì?

Tôi cần Regex có thể đáp ứng tất cả ba điều kiện của tôi cho mã zip. Ví dụ-

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

Bất kỳ gợi ý và đề xuất sẽ được đánh giá cao. Cảm ơn !


4
Việc đóng bản sao trông có vẻ sơ sài - bản dupe đang yêu cầu một regex sẽ khớp với bất kỳ mã bưu điện nào từ bất kỳ quốc gia nào, trong khi câu hỏi này yêu cầu một regex để khớp với mã zip, đây là điều chỉ có ở Hoa Kỳ, điều này làm cho câu hỏi này trở nên nhiều hẹp trong phạm vi hơn dupe - nhưng có trên thực tế một câu trả lời được tìm thấy tại dupe. Xem stackoverflow.com/a/7185241/1709587 liệt kê các mã bưu chính của Unicode CLDR (cũ, hiện không được dùng nữa, nhưng có lẽ vẫn phù hợp trong nhiều trường hợp) cho> 100 quốc gia, bao gồm cả Hoa Kỳ. Regex của Hoa Kỳ là \d{5}([ \-]\d{4})?.
Mark Amery

Câu trả lời:


310
^\d{5}(?:[-\s]\d{4})?$
  • ^ = Bắt đầu của chuỗi.
  • \d{5} = Ghép 5 chữ số (cho điều kiện 1, 2, 3)
  • (?:…) = Phân nhóm
  • [-\s] = Khớp một khoảng trắng (cho điều kiện 3) hoặc một dấu gạch nối (cho điều kiện 2)
  • \d{4} = Khớp 4 chữ số (cho điều kiện 2, 3)
  • …? = Mẫu trước nó là tùy chọn (đối với điều kiện 1)
  • $ = Kết thúc chuỗi.

7
\ssẽ khớp với bất kỳ khoảng trắng nào, bao gồm các tab và các dòng mới.
mí mắt,

1
Hi gì về tình trạng 123451234 không có dấu cách
Ajay Suwalka

4
@ProVega: Đọc nhận xét về câu trả lời (hiện đã bị xóa) mà bạn đã liên kết, có vẻ như không chính xác. Ví dụ: 00544là một mã zip hợp lệ; 544không phải.
Keith Thompson

2
@AjaySuwalka: Tất cả những gì bạn phải làm để chứa 123451234 mà không có chỗ trống là nơi a? sau [- \ s], vì vậy nó sẽ trở thành: ^ \ d {5} (?: [- \ s]? \ d {4})? $
Grungondola

6
Đến bữa tiệc hơi muộn và có thể không phải là tiếng chuông đẹp nhất tại vũ hội, nhưng tôi đã thêm các khoảng trống tùy chọn bổ sung ở hai bên của dấu gạch nối - chủ yếu là để thẩm mỹ. /(^\d{5}(?:[\s]?[-\s][\s]?\d{4})?$)/
Birrel,

4

Chỉ đối với ba điều kiện được liệt kê, các biểu thức này cũng có thể hoạt động:

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

Vui lòng xem bản trình diễn này để giải thích thêm.

Nếu chúng ta có khoảng trắng bổ sung không mong muốn trong khoảng từ 5 đến 4 chữ số hoặc một mã zip 9 chữ số liên tục, chẳng hạn như:

123451234
12345 1234
12345  1234

Ví dụ, biểu thức này sẽ là một tùy chọn phụ với ít ràng buộc hơn:

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

Vui lòng xem bản trình diễn này để giải thích thêm.

Mạch RegEx

jex.im trực quan hóa các biểu thức chính quy:

nhập mô tả hình ảnh ở đây

Kiểm tra

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

Tôi biết điều này có thể hiển nhiên đối với hầu hết những người sử dụng RegEx thường xuyên, nhưng trong trường hợp bất kỳ độc giả nào chưa quen với RegEx, tôi nghĩ tôi nên chỉ ra một quan sát mà tôi đã thực hiện có ích cho một trong những dự án của tôi.

Trong một câu trả lời trước từ @kennytm:

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

…? = Mẫu trước nó là tùy chọn (đối với điều kiện 1)

Nếu bạn muốn cho phép cả mã zip 5 chữ số và +4 tiêu chuẩn, đây là một ví dụ tuyệt vời.

Để chỉ khớp mã zip ở định dạng 'Zip + 4' của Hoa Kỳ khi tôi cần làm (chỉ điều kiện 2 và 3), chỉ cần xóa mã cuối cùng ?để nó luôn khớp với nhóm 5 ký tự cuối cùng.

Một công cụ hữu ích mà tôi khuyên dùng để mày mò với RegEx được liên kết bên dưới:

https://regexr.com/

Tôi sử dụng công cụ này thường xuyên khi tôi thấy RegEx hoạt động tương tự như những gì tôi cần, nhưng có thể được điều chỉnh tốt hơn một chút. Nó cũng có một menu tham chiếu RegEx tiện lợi và giao diện thông tin giúp bạn biết các thay đổi của bạn ảnh hưởng như thế nào đến các kết quả phù hợp với văn bản mẫu bạn đã nhập.

Nếu tôi có gì sai hoặc bỏ sót một thông tin quan trọng, vui lòng sửa cho tôi.


hoặc bạn có thể tham khảo hướng dẫn regex này - youtube.com/watch?v=8uCHRyK_VMo
Krishnraj Rana
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.