2013-04-02 39 views
20
var regex = /[A-Za-z]\d[A-Za-z] ?\d[A-Za-z]\d/; 
var match = regex.exec(value); 
if (match){ 
    if ((value.indexOf("-") !== -1 || value.indexOf(" ") !== -1) && value.length() == 7) { 
     return true; 
    } else if ((value.indexOf("-") == -1 || value.indexOf(" ") == -1) && value.length() == 6) { 
     return true; 
    } 
} else { 
     return false; 
} 

Regex sẽ tìm mẫu A0A 1B1. kiểm tra đúng:Regex hiệu quả đối với chức năng mã bưu điện của Canada

A0A 1B1

A0A1B1

A0A1B1

A0A1B1C < < vấn đề con

vì vậy tôi thêm một kiểm tra cho "-" hoặc "" và sau đó một kiểm tra chiều dài.

Có phương pháp regex hay phương pháp hiệu quả hơn không?

Trả lời

26

Thêm neo để mô hình của bạn:

var regex = /^[A-Za-z]\d[A-Za-z][ -]?\d[A-Za-z]\d$/; 

^ có nghĩa là "sự khởi đầu của chuỗi" và $ có nghĩa là "kết thúc chuỗi". Việc thêm các neo này sẽ ngăn không cho C trượt vào khớp vì mẫu của bạn bây giờ sẽ mong đợi một chuỗi toàn bộ bao gồm 6 ký tự (đôi khi 7 - dưới dạng dấu cách). Điều này thêm tiền thưởng nên bây giờ làm giảm bớt bạn phải sau đó kiểm tra chiều dài chuỗi.

Ngoài ra, vì có vẻ như bạn muốn cho phép gạch nối, bạn có thể trượt dấu gạch nối đó vào lớp ký tự tùy chọn bao gồm khoảng trắng bạn đang sử dụng ban đầu. Hãy chắc chắn để lại dấu gạch nối là ký tự đầu tiên hoặc cuối cùng; nếu không, bạn sẽ cần phải thoát khỏi nó (sử dụng dấu gạch chéo ngược hàng đầu) để ngăn công cụ regex giải thích nó như là một phần của phạm vi ký tự (ví dụ: A-Z).

+4

Tôi sẽ chuyển sang nói rằng anh ấy cũng có thể sử dụng cờ 'i' để kiểm tra chữ hoa/chữ thường không cần thiết. – Dave

+0

+1 regex rất gọn gàng. – jurgenreza

+6

Điều đó sẽ cho phép Mã bưu điện của Canada không hợp lệ. Mã bưu điện không bao giờ bắt đầu bằng các ký tự có thể bị nhầm lẫn với các số: I, O, Q, U, W, Z ... Do đó:/^ [ABCEGHJKLMNPRSTVXY] \ d [-]? \ D [A-Za-z] \ d $ /; –

10

Mã này xử lý mã của chúng tôi và mã.

function postalFilter (postalCode) { 

    if (! postalCode) { 
     return null; 
    } 

    postalCode = postalCode.toString().trim(); 

    var us = new RegExp("^\\d{5}(-{0,1}\\d{4})?$"); 
    var ca = new RegExp(/([ABCEGHJKLMNPRSTVXY]\d)([ABCEGHJKLMNPRSTVWXYZ]\d){2}/i); 

    if (us.test(postalCode.toString())) { 
     return postalCode; 
    } 

    if (ca.test(postalCode.toString().replace(/\W+/g, ''))) { 
     return postalCode; 
    } 
    return null; 
} 

// these 5 return null 
console.log(postalFilter('1a1 a1a')); 
console.log(postalFilter('F1A AiA')); 
console.log(postalFilter('A12345-6789')); 
console.log(postalFilter('W1a1a1')); // no "w" 
console.log(postalFilter('Z1a1a1')); // ... or "z" allowed in first position! 

// these return canada postal less space 
console.log(postalFilter('a1a 1a1')); 
console.log(postalFilter('H0H 0H0')); 

// these return unaltered 
console.log(postalFilter('H0H0H0')); 
console.log(postalFilter('a1a1a1')); 
console.log(postalFilter('12345')); 
console.log(postalFilter('12345-6789')); 
console.log(postalFilter('123456789')); 

// strip spaces 
console.log(postalFilter(' 12345 ')); 
+0

Câu trả lời này có một regex sạch hơn và chính xác hơn so với câu trả lời hiện được chấp nhận, vì mã bưu chính Canada luôn bỏ qua các chữ cái D, F, I, O, Q và U. '/([ ABCEGHJKLMNPRSTVWXYZ] \ d) {3}/i' Tuy nhiên, một điều kiện bị thiếu là chữ cái đầu tiên không thể là W hoặc Z. https://en.wikipedia.org/wiki/Postal_codes_in_Canada#Number_of_possible_postal_codes –

+0

Dường như làm việc cho tôi, cảm ơn. – Antoine

+0

@RobertPenner là chính xác. Tôi đã sửa biểu thức chính quy cho mã Canada. Tôi muốn đặt cược một đồng đô la có một cách tốt hơn để làm điều đó, mặc dù. – lysdexia

-1
function postalFilter (postalCode, type) { 

    if (!postalCode) { 
     return null; 
    } 

    postalCode = postalCode.toString().trim(); 

    var us = new RegExp("^\\d{5}(-{0,1}\\d{4})?$"); 
    // var ca = new RegExp(/^((?!.*[DFIOQU])[A-VXY][0-9][A-Z])|(?!.*[DFIOQU])[A-VXY][0-9][A-Z]\ ?[0-9][A-Z][0-9]$/i); 
    var ca = new RegExp(/^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ]()?\d[ABCEGHJKLMNPRSTVWXYZ]\d$/i); 

    if(type == "us"){ 
     if (us.test(postalCode.toString())) { 
      console.log(postalCode); 
      return postalCode; 
     } 
    } 

    if(type == "ca") 
    { 
     if (ca.test(postalCode.toString())) { 
      console.log(postalCode); 
      return postalCode; 
     } 
    } 

    return null; 
} 
5

Bạn có một vấn đề với các regex StatsCan đã đăng các quy tắc cho một mã bưu chính Canada có giá trị là những gì:

Mã bưu chính là một mã sáu ký tự xác định và duy trì bởi Tổng công ty Bưu chính Canada (CPC) cho mục đích phân loại và gửi thư. Các ký tự được sắp xếp theo dạng ‘ANA NAN’, trong đó ‘A’ thể hiện ký tự chữ cái và ‘N’ đại diện cho một ký tự số (ví dụ: K1A 0T6). Mã bưu chính sử dụng 18 chữ cái ký tự và 10 ký tự số. Mã bưu chính không bao gồm chữ D, F, I, O, Q hoặc U, và vị trí đầu tiên cũng không làm cho sử dụng các chữ cái W hoặc Z.

Các regex nên nếu bạn muốn nó nghiêm ngặt.

/^[ABCEGHJ-NPRSTVXY][0-9][ABCEGHJ-NPRSTV-Z] [0-9][ABCEGHJ-NPRSTV-Z][0-9]$/ 

Cũng \ d nghĩa là số không nhất thiết 0-9 có thể có một trình duyệt không đúng tiêu chuẩn mà đối xử với nó như bất kỳ số lượng trong không gian unicode mà có khả năng sẽ gây ra vấn đề cho bạn hạ lưu.

từ: https://trajano.net/2017/05/canadian-postal-code-validation/

0

tài tử tế, mã bưu chính nghiêm ngặt:

/^[ABCEGHJ-NPRSTVXY]\d[ABCEGHJ-NPRSTV-Z][ -]?\d[ABCEGHJ-NPRSTV-Z]\d$/i 

phép:

  • h2t-1b8
  • h2z 1b8
  • H21B8

Không cho phép:

  • Z2T 1B8 (hàng đầu Z)
  • H2T 1O3 (chứa O)

Leading Z, W hoặc để chứa D, F, I, O, Q hoặc U

Các vấn đề liên quan