gridref1
by Chris Dennis
JavaScript
const RE100km = /^(?<prefix>[HNSOT][A-HJ-Z])$/;
const RE10km = /^(?<prefix>[HNSOT][A-HJ-Z])(?<digits>\d\d)$/;
const RE5km = /^(?<prefix>[HNSOT][A-HJ-Z])(?<digits>\d\d)(?<suffix5k>(NW|NE|SE|SW))$/;
const RE2km = /^(?<prefix>[HNSOT][A-HJ-Z])(?<digits>\d\d)(?<suffix2k>[A-NP-Z])$/;
const RE1km = /^(?<prefix>[HNSOT][A-HJ-Z])(?<digits>\d{4})$/;
const RE100m = /^(?<prefix>[HNSOT][A-HJ-Z])(?<digits>\d{6})$/;
const RE10m = /^(?<prefix>[HNSOT][A-HJ-Z])(?<digits>\d{8})$/;
const RE1m = /^(?<prefix>[HNSOT][A-HJ-Z])(?<digits>\d{10})$/;
const REgx = /^(?<prefix>[HNSOT][A-HJ-Z])(?<digits>(\d\d)+)(?<suffix>([A-NP-Z]|NW|NE|SE|SW)?)$/;
const REgr = /^(?<prefix>[HNOST][A-HJ-Z])(?<first2>\d\d)(?<suffix>[A-NP-Z]|NW|NE|SE|SW)?(?<digits>(\d\d){0,4})$/;
for (let gr of ["SU48", "SU48B", "SU48NW", "SU4830", "xyzzy", "SU4830A", "PQ1234", "", 42, "SU123", "SU0123456789", "SU0123456789012"]) {
let result = REgr.exec(gr);
if (result === null) {
console.log(gr, "failed");
} else {
console.log(gr, result);
console.log(result.groups.prefix, result.groups.first2, result.groups.suffix, result.groups.digits);
}
}