2013-04-02 9 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; 
} 

La regex cerca il modello A0A 1B1. vere prove:Efficace espressione regolare per la funzione di codice postale canadese

A0A 1B1

A0A1B1

A0A1B1

A0A1B1C < < problema bambino

così ho aggiunto un assegno per "-" o "" e poi un controlla la lunghezza.

Esiste una regex o un metodo più efficiente?

risposta

26

Aggiungi ancore per il vostro modello:

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

^ significa "inizio della stringa" e $ significa "fine della stringa". L'aggiunta di questi ancoraggi impedirà allo C di scivolare nella corrispondenza poiché il tuo modello ora si aspetta che una stringa intera sia composta da 6 (a volte 7 - come spazio) caratteri. Questo bonus aggiuntivo dovrebbe ora alleviare l'utente di dover successivamente controllare la lunghezza della stringa.

Inoltre, poiché sembra che si desidera consentire trattini, è possibile inserirlo in una classe di caratteri facoltativa che include lo spazio che si stava originariamente utilizzando. Assicurati di lasciare il trattino come primo o ultimo carattere; in caso contrario, sarà necessario evaderlo (utilizzando una barra rovesciata iniziale) per impedire al motore regex di interpretarlo come parte di un intervallo di caratteri (ad esempio A-Z).

+4

Salto per dire che potrebbe anche usare il flag 'i' in modo che i controlli espliciti maiuscole/minuscole non siano necessari. – Dave

+0

+1 regex molto accurato. – jurgenreza

+6

Ciò consentirà codici postali canadesi non validi. I codici postali non iniziano mai con caratteri che potrebbero essere scambiati per numeri: I, O, Q, U, W, Z ... Quindi:/^ [ABCEGHJKLMNPRSTVXY] \ d [-]? \ D [A-Za-z] \ d $ /; –

10

Questo ci gestisce codici ca e.

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

Questa risposta ha una regex più pulita e accurata rispetto alla risposta attualmente accettata, perché i codici postali del Canada omettono sempre le lettere D, F, I, O, Q e U. '/([ ABCEGHJKLMNPRSTVWXYZ] \ d) {3}/I' Una condizione mancante, però, è che la prima lettera non può essere W o Z. https://en.wikipedia.org/wiki/Postal_codes_in_Canada#Number_of_possible_postal_codes –

+0

sembra funzionare per me, grazie. – Antoine

+0

@RobertPenner è corretto. Ho corretto l'espressione regolare per i codici Canada. Scommetterei un dollaro c'è un modo più bello per farlo, però. – 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

hai un problema con l'espressione regolare StatsCan ha pubblicato le regole per quello che è un codice postale canadese valido:

Il codice postale è un codice a sei caratteri definito e mantenuto da Canada Post Corporation (CPC) ai fini dello smistamento e recapito di posta. I caratteri sono disposti nella forma 'ANA NAN', dove 'A' rappresenta un carattere alfabetico e 'N' rappresenta un carattere numerico (ad es. K1A 0T6). Il codice postale utilizza 18 caratteri alfabetici e 10 caratteri numerici. codici postali non includono le lettere D, F, I, O, Q o U, e la prima posizione anche non fanno impiego delle lettere W o Z.

La regex dovrebbe essere, se si voleva è rigoroso.

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

anche \ D significa numero non necessariamente 0-9 ci può essere quella del browser vagante che lo tratta come un qualsiasi numero nello spazio unicode che probabilmente causare problemi per voi a valle.

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

0

tipo d'uso, codice postale rigoroso:

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

Consente:

  • H2T-1B8
  • H2Z 1B8
  • H21B8

non consente:

  • Z2T 1B8 (leader Z)
  • H2T 1O3 (contiene O)

principale Z, W o contenere D, F, I, O, Q o U

Problemi correlati