in globalize/globalize.ts [935:1025]
getParseRegExp = function (cal, format) {
// converts a format string into a regular expression with groups that
// can be used to extract date fields from a date string.
// check for a cached parse regex.
var re = cal._parseRegExp;
if (!re) {
cal._parseRegExp = re = {};
}
else {
var reFormat = re[format];
if (reFormat) {
return reFormat;
}
}
// expand single digit formats, then escape regular expression characters.
var expFormat = expandFormat(cal, format).replace(/([\^\$\.\*\+\?\|\[\]\(\)\{\}])/g, "\\\\$1"),
regexp = ["^"],
groups = [],
index = 0,
quoteCount = 0,
tokenRegExp = getTokenRegExp(),
match;
// iterate through each date token found.
while ((match = tokenRegExp.exec(expFormat)) !== null) {
var preMatch = expFormat.slice(index, match.index);
index = tokenRegExp.lastIndex;
// don't replace any matches that occur inside a string literal.
quoteCount += appendPreOrPostMatch(preMatch, regexp);
if (quoteCount % 2) {
regexp.push(match[0]);
continue;
}
// add a regex group for the token.
var m = match[0],
len = m.length,
add;
switch (m) {
case "dddd": case "ddd":
case "MMMM": case "MMM":
case "gg": case "g":
add = "(\\D+)";
break;
case "tt": case "t":
add = "(\\D*)";
break;
case "yyyy":
case "fff":
case "ff":
case "f":
add = "(\\d{" + len + "})";
break;
case "dd": case "d":
case "MM": case "M":
case "yy": case "y":
case "HH": case "H":
case "hh": case "h":
case "mm": case "m":
case "ss": case "s":
add = "(\\d\\d?)";
break;
case "zzz":
add = "([+-]?\\d\\d?:\\d{2})";
break;
case "zz": case "z":
add = "([+-]?\\d\\d?)";
break;
case "/":
add = "(\\" + cal["/"] + ")";
break;
default:
throw "Invalid date format pattern \'" + m + "\'.";
}
if (add) {
regexp.push(add);
}
groups.push(match[0]);
}
appendPreOrPostMatch(expFormat.slice(index), regexp);
regexp.push("$");
// allow whitespace to differ when matching formats.
var regexpStr = regexp.join("").replace(/\s+/g, "\\s+"),
parseRegExp = { "regExp": regexpStr, "groups": groups };
// cache the regex for this format.
return re[format] = parseRegExp;
};