Brazilian ZipCode Validation
by Bruno Augusto
JavaScript
function validateBrazilianZipCode( zip, state ) {
zip = zip.replace( /\D/g, '' );
if( zip.length != 8 ) return false;
state = state.toUpperCase();
if( state.length == 2 && validateBrazilianFederativeUnits( state ) ) {
var patterns = {
'AC': '[6][9]{2}[0-9]{2}',
'AL': '[5][7][0-9]{3}',
'AM': '[6][9][0-8][0-9]{2}',
'AP': '[6][89][9][0-9]{2}',
'BA': '[4][0-8][0-9]{3}',
'CE': '[6][0-3][0-9]{3}',
'DF': '[7][0-3][0-6][0-9]{2}',
'ES': '[2][9][0-9]{3}',
'GO': '[7][3-6][7-9][0-9]{2}',
'MA': '[6][5][0-9]{3}',
'MG': '[3][0-9]{4}',
'MS': '[7][9][0-9]{3}',
'MT': '[7][8][8][0-9]{2}',
'PA': '[6][6-8][0-8][0-9]{2}',
'PB': '[5][8][0-9]{3}',
'PE': '[5][0-6][0-9]{2}',
'PI': '[6][4][0-9]{3}',
'PR': '[8][0-7][0-9]{3}',
'RJ': '[2][0-8][0-9]{3}',
'RN': '[5][9][0-9]{3}',
'RO': '[7][8][9][0-9]{2}',
'RR': '[6][9][3][0-9]{2}',
'RS': '[9][0-9]{4}',
'SC': '[8][89][0-9]{3}',
'SE': '[4][9][0-9]{3}',
'SP': '([1][0-9]{3}|[01][0-9]{4})',
'TO': '[7][7][0-9]{3}',
};
return new RegExp( patterns[ state ] ).test( zip.substr( 0, 5 ) );
}
return false;
}
function validateBrazilianFederativeUnits( state ) {
return new RegExp(
'^A[CLMP]|BA|CE|DF|ES|[GT]O|M[AGST]|P[ABEIR]|R[JNORS]|S[CEP]$'
).test( state.toUpperCase() );
}
console.log( validateBrazilianZipCode( '37500-182', 'MG' ) );
console.log( validateBrazilianZipCode( '37500-182', 'SP' ) );