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' ) );