Skip to content

Instantly share code, notes, and snippets.

@intel352
Created August 22, 2014 15:11
Show Gist options
  • Save intel352/df12f16788a91b51c60f to your computer and use it in GitHub Desktop.
Save intel352/df12f16788a91b51c60f to your computer and use it in GitHub Desktop.
Postal code validation
importPackage( dw.system );
importScript("utils/Underscore.ds");
var _ = getUnderscore();
function PostalCode() {}
(function(){
// Sourced from http://unicode.org/cldr/trac/browser/tags/release-24/common/supplemental/postalCodeData.xml
PostalCode.patterns = [
{
"territoryId": "GB",
"regex": "GIR[ ]?0AA|(?:(?:AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|CA|CB|CF|CH|CM|CO|CR|CT|CV|CW|DA|DD|DE|DG|DH|DL|DN|DT|DY|E|EC|EH|EN|EX|FK|FY|G|GL|GY|GU|HA|HD|HG|HP|HR|HS|HU|HX|IG|IM|IP|IV|JE|KA|KT|KW|KY|L|LA|LD|LE|LL|LN|LS|LU|M|ME|MK|ML|N|NE|NG|NN|NP|NR|NW|OL|OX|PA|PE|PH|PL|PO|PR|RG|RH|RM|S|SA|SE|SG|SK|SL|SM|SN|SO|SP|SR|SS|ST|SW|SY|TA|TD|TF|TN|TQ|TR|TS|TW|UB|W|WA|WC|WD|WF|WN|WR|WS|WV|YO|ZE)(?:\\d[\\dA-Z]?[ ]?\\d[ABD-HJLN-UW-Z]{2}))|BFPO[ ]?\\d{1,4}"
},
{
"territoryId": "JE",
"regex": "JE\\d[\\dA-Z]?[ ]?\\d[ABD-HJLN-UW-Z]{2}"
},
{
"territoryId": "GG",
"regex": "GY\\d[\\dA-Z]?[ ]?\\d[ABD-HJLN-UW-Z]{2}"
},
{
"territoryId": "IM",
"regex": "IM\\d[\\dA-Z]?[ ]?\\d[ABD-HJLN-UW-Z]{2}"
},
{
"territoryId": "US",
"regex": "\\d{5}(?:[ \\-]\\d{4})?"
},
{
"territoryId": "CA",
"regex": "[ABCEGHJKLMNPRSTVXY]\\d[ABCEGHJ-NPRSTV-Z][ ]?\\d[ABCEGHJ-NPRSTV-Z]\\d"
},
{
"territoryId": "DE",
"regex": "\\d{5}"
},
{
"territoryId": "JP",
"regex": "\\d{3}-\\d{4}"
},
{
"territoryId": "FR",
"regex": "\\d{2}[ ]?\\d{3}"
},
{
"territoryId": "AU",
"regex": "\\d{4}"
},
{
"territoryId": "IT",
"regex": "\\d{5}"
},
{
"territoryId": "CH",
"regex": "\\d{4}"
},
{
"territoryId": "AT",
"regex": "\\d{4}"
},
{
"territoryId": "ES",
"regex": "\\d{5}"
},
{
"territoryId": "NL",
"regex": "\\d{4}[ ]?[A-Z]{2}"
},
{
"territoryId": "BE",
"regex": "\\d{4}"
},
{
"territoryId": "DK",
"regex": "\\d{4}"
},
{
"territoryId": "SE",
"regex": "\\d{3}[ ]?\\d{2}"
},
{
"territoryId": "NO",
"regex": "\\d{4}"
},
{
"territoryId": "BR",
"regex": "\\d{5}[\\-]?\\d{3}"
},
{
"territoryId": "PT",
"regex": "\\d{4}([\\-]\\d{3})?"
},
{
"territoryId": "FI",
"regex": "\\d{5}"
},
{
"territoryId": "AX",
"regex": "22\\d{3}"
},
{
"territoryId": "KR",
"regex": "\\d{3}[\\-]\\d{3}"
},
{
"territoryId": "CN",
"regex": "\\d{6}"
},
{
"territoryId": "TW",
"regex": "\\d{3}(?:\\d{2})?"
},
{
"territoryId": "SG",
"regex": "\\d{6}"
},
{
"territoryId": "DZ",
"regex": "\\d{5}"
},
{
"territoryId": "AD",
"regex": "AD\\d{3}"
},
{
"territoryId": "AR",
"regex": "(?:[A-HJ-NP-Z])?\\d{4}(?:[A-Z]{3})?"
},
{
"territoryId": "AM",
"regex": "(?:37)?\\d{4}"
},
{
"territoryId": "AZ",
"regex": "\\d{4}"
},
{
"territoryId": "BH",
"regex": "(?:(?:1[0-2]|[2-9])\\d{2})?"
},
{
"territoryId": "BD",
"regex": "\\d{4}"
},
{
"territoryId": "BB",
"regex": "(?:BB\\d{5})?"
},
{
"territoryId": "BY",
"regex": "\\d{6}"
},
{
"territoryId": "BM",
"regex": "[A-Z]{2}[ ]?[A-Z0-9]{2}"
},
{
"territoryId": "BA",
"regex": "\\d{5}"
},
{
"territoryId": "IO",
"regex": "BBND 1ZZ"
},
{
"territoryId": "BN",
"regex": "[A-Z]{2}[ ]?\\d{4}"
},
{
"territoryId": "BG",
"regex": "\\d{4}"
},
{
"territoryId": "KH",
"regex": "\\d{5}"
},
{
"territoryId": "CV",
"regex": "\\d{4}"
},
{
"territoryId": "CL",
"regex": "\\d{7}"
},
{
"territoryId": "CR",
"regex": "\\d{4,5}|\\d{3}-\\d{4}"
},
{
"territoryId": "HR",
"regex": "\\d{5}"
},
{
"territoryId": "CY",
"regex": "\\d{4}"
},
{
"territoryId": "CZ",
"regex": "\\d{3}[ ]?\\d{2}"
},
{
"territoryId": "DO",
"regex": "\\d{5}"
},
{
"territoryId": "EC",
"regex": "(?:[A-Z]\\d{4}[A-Z]|(?:[A-Z]{2})?\\d{6})?"
},
{
"territoryId": "EG",
"regex": "\\d{5}"
},
{
"territoryId": "EE",
"regex": "\\d{5}"
},
{
"territoryId": "FO",
"regex": "\\d{3}"
},
{
"territoryId": "GE",
"regex": "\\d{4}"
},
{
"territoryId": "GR",
"regex": "\\d{3}[ ]?\\d{2}"
},
{
"territoryId": "GL",
"regex": "39\\d{2}"
},
{
"territoryId": "GT",
"regex": "\\d{5}"
},
{
"territoryId": "HT",
"regex": "\\d{4}"
},
{
"territoryId": "HN",
"regex": "(?:\\d{5})?"
},
{
"territoryId": "HU",
"regex": "\\d{4}"
},
{
"territoryId": "IS",
"regex": "\\d{3}"
},
{
"territoryId": "IN",
"regex": "\\d{6}"
},
{
"territoryId": "ID",
"regex": "\\d{5}"
},
{
"territoryId": "IL",
"regex": "\\d{5}"
},
{
"territoryId": "JO",
"regex": "\\d{5}"
},
{
"territoryId": "KZ",
"regex": "\\d{6}"
},
{
"territoryId": "KE",
"regex": "\\d{5}"
},
{
"territoryId": "KW",
"regex": "\\d{5}"
},
{
"territoryId": "LA",
"regex": "\\d{5}"
},
{
"territoryId": "LV",
"regex": "\\d{4}"
},
{
"territoryId": "LB",
"regex": "(?:\\d{4}(?:[ ]?\\d{4})?)?"
},
{
"territoryId": "LI",
"regex": "(?:948[5-9])|(?:949[0-7])"
},
{
"territoryId": "LT",
"regex": "\\d{5}"
},
{
"territoryId": "LU",
"regex": "\\d{4}"
},
{
"territoryId": "MK",
"regex": "\\d{4}"
},
{
"territoryId": "MY",
"regex": "\\d{5}"
},
{
"territoryId": "MV",
"regex": "\\d{5}"
},
{
"territoryId": "MT",
"regex": "[A-Z]{3}[ ]?\\d{2,4}"
},
{
"territoryId": "MU",
"regex": "(?:\\d{3}[A-Z]{2}\\d{3})?"
},
{
"territoryId": "MX",
"regex": "\\d{5}"
},
{
"territoryId": "MD",
"regex": "\\d{4}"
},
{
"territoryId": "MC",
"regex": "980\\d{2}"
},
{
"territoryId": "MA",
"regex": "\\d{5}"
},
{
"territoryId": "NP",
"regex": "\\d{5}"
},
{
"territoryId": "NZ",
"regex": "\\d{4}"
},
{
"territoryId": "NI",
"regex": "(?:(?:\\d{4}-)?\\d{3}-\\d{3}(?:-\\d{1})?)?"
},
{
"territoryId": "NG",
"regex": "(?:\\d{6})?"
},
{
"territoryId": "OM",
"regex": "(?:PC )?\\d{3}"
},
{
"territoryId": "PK",
"regex": "\\d{5}"
},
{
"territoryId": "PY",
"regex": "\\d{4}"
},
{
"territoryId": "PH",
"regex": "\\d{4}"
},
{
"territoryId": "PL",
"regex": "\\d{2}-\\d{3}"
},
{
"territoryId": "PR",
"regex": "00[679]\\d{2}(?:[ \\-]\\d{4})?"
},
{
"territoryId": "RO",
"regex": "\\d{6}"
},
{
"territoryId": "RU",
"regex": "\\d{6}"
},
{
"territoryId": "SM",
"regex": "4789\\d"
},
{
"territoryId": "SA",
"regex": "\\d{5}"
},
{
"territoryId": "SN",
"regex": "\\d{5}"
},
{
"territoryId": "SK",
"regex": "\\d{3}[ ]?\\d{2}"
},
{
"territoryId": "SI",
"regex": "\\d{4}"
},
{
"territoryId": "ZA",
"regex": "\\d{4}"
},
{
"territoryId": "LK",
"regex": "\\d{5}"
},
{
"territoryId": "TJ",
"regex": "\\d{6}"
},
{
"territoryId": "TH",
"regex": "\\d{5}"
},
{
"territoryId": "TN",
"regex": "\\d{4}"
},
{
"territoryId": "TR",
"regex": "\\d{5}"
},
{
"territoryId": "TM",
"regex": "\\d{6}"
},
{
"territoryId": "UA",
"regex": "\\d{5}"
},
{
"territoryId": "UY",
"regex": "\\d{5}"
},
{
"territoryId": "UZ",
"regex": "\\d{6}"
},
{
"territoryId": "VA",
"regex": "00120"
},
{
"territoryId": "VE",
"regex": "\\d{4}"
},
{
"territoryId": "ZM",
"regex": "\\d{5}"
},
{
"territoryId": "AS",
"regex": "96799"
},
{
"territoryId": "CC",
"regex": "6799"
},
{
"territoryId": "CK",
"regex": "\\d{4}"
},
{
"territoryId": "RS",
"regex": "\\d{6}"
},
{
"territoryId": "ME",
"regex": "8\\d{4}"
},
{
"territoryId": "CS",
"regex": "\\d{5}"
},
{
"territoryId": "YU",
"regex": "\\d{5}"
},
{
"territoryId": "CX",
"regex": "6798"
},
{
"territoryId": "ET",
"regex": "\\d{4}"
},
{
"territoryId": "FK",
"regex": "FIQQ 1ZZ"
},
{
"territoryId": "NF",
"regex": "2899"
},
{
"territoryId": "FM",
"regex": "(?:9694[1-4])(?:[ \\-]\\d{4})?"
},
{
"territoryId": "GF",
"regex": "9[78]3\\d{2}"
},
{
"territoryId": "GN",
"regex": "\\d{3}"
},
{
"territoryId": "GP",
"regex": "9[78][01]\\d{2}"
},
{
"territoryId": "GS",
"regex": "SIQQ 1ZZ"
},
{
"territoryId": "GU",
"regex": "969[123]\\d(?:[ \\-]\\d{4})?"
},
{
"territoryId": "GW",
"regex": "\\d{4}"
},
{
"territoryId": "HM",
"regex": "\\d{4}"
},
{
"territoryId": "IQ",
"regex": "\\d{5}"
},
{
"territoryId": "KG",
"regex": "\\d{6}"
},
{
"territoryId": "LR",
"regex": "\\d{4}"
},
{
"territoryId": "LS",
"regex": "\\d{3}"
},
{
"territoryId": "MG",
"regex": "\\d{3}"
},
{
"territoryId": "MH",
"regex": "969[67]\\d(?:[ \\-]\\d{4})?"
},
{
"territoryId": "MN",
"regex": "\\d{6}"
},
{
"territoryId": "MP",
"regex": "9695[012](?:[ \\-]\\d{4})?"
},
{
"territoryId": "MQ",
"regex": "9[78]2\\d{2}"
},
{
"territoryId": "NC",
"regex": "988\\d{2}"
},
{
"territoryId": "NE",
"regex": "\\d{4}"
},
{
"territoryId": "VI",
"regex": "008(?:(?:[0-4]\\d)|(?:5[01]))(?:[ \\-]\\d{4})?"
},
{
"territoryId": "PF",
"regex": "987\\d{2}"
},
{
"territoryId": "PG",
"regex": "\\d{3}"
},
{
"territoryId": "PM",
"regex": "9[78]5\\d{2}"
},
{
"territoryId": "PN",
"regex": "PCRN 1ZZ"
},
{
"territoryId": "PW",
"regex": "96940"
},
{
"territoryId": "RE",
"regex": "9[78]4\\d{2}"
},
{
"territoryId": "SH",
"regex": "(?:ASCN|STHL) 1ZZ"
},
{
"territoryId": "SJ",
"regex": "\\d{4}"
},
{
"territoryId": "SO",
"regex": "\\d{5}"
},
{
"territoryId": "SZ",
"regex": "[HLMS]\\d{3}"
},
{
"territoryId": "TC",
"regex": "TKCA 1ZZ"
},
{
"territoryId": "WF",
"regex": "986\\d{2}"
},
{
"territoryId": "XK",
"regex": "\\d{5}"
},
{
"territoryId": "YT",
"regex": "976\\d{2}"
}
];
PostalCode.match = function(postalCode : String, territoryId : String) : Object {
if (!postalCode || !_.isString(postalCode)) {
return false;
}
let patterns = [];
if (territoryId && _.isString(territoryId)) {
if (territoryId.length==2) {
let pattern : Object = _.find(PostalCode.patterns, function(v){if (territoryId == v.territoryId){return true;} return false;});
if (!pattern) {
return false;
}
patterns.push(pattern);
} else {
return false;
}
} else {
patterns = PostalCode.patterns;
}
//Logger.debug("patterns: {0}", JSON.stringify(patterns));
return _.find(patterns, function(v){
let regex : RegExp = new RegExp("^"+v.regex+"$", "i"),
matches = postalCode.match(regex);
//Logger.debug("territoryId: {0} regex: {1} matches: {2}", v.territoryId, regex, JSON.stringify(matches));
return (matches && matches.length>0 && matches[0]==postalCode);
});
};
PostalCode.validate = function(postalCode : String, territoryId : String) : Boolean {
return !!(PostalCode.match(postalCode, territoryId));
};
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment