PrivateFunction: urlRegexp
Takes a route URL with possible placeholders like "/contacts/:contactid" and
prepares a RegEx for later pattern matching when trying to resolve a route

Thanks to:
* https://github.com/visionmedia/express/blob/master/lib/utils.js#L277

Parameters:
(String) url - The url pattern to create the regex of
(Array) keys - An array which will contain all identified placeholder
names afterwards
(Boolean) sensitive - Create Regex case sensitive?
(Boolean) strict - Create Regex in strict mode?

Returns:
(Regexp)
function urlRegexp(url, keys, sensitive, strict) {
	if (url.toString() === '[object RegExp]') { return url; }
	if (Array.isArray(url)) { url = '(' + url.join('|') + ')'; }
	url = url
	.concat(strict ? '' : '/?')
	.replace(/\/\(/g, '(?:/')
		.replace(/(\/)?(\.)?:(\w+)(?:(\(.*?\)))?(\?)?(\*)?/g, function(
			_, slash, format, key, capture, optional, star){
				keys.push({ name: key, optional: !! optional });
				slash = slash || '';
				return '' +
					(optional ? '' : slash) +
					'(?:' +
					(optional ? slash : '') +
					(format || '') +
					(capture || (format && '([^/.]+?)' || '([^/]+?)')) + ')' +
					(optional || '') +
					(star ? '(/*)?' : '');
		})
		.replace(/([\/.])/g, '\\$1')
		.replace(/\*/g, '(.*)');

	return new RegExp('^' + url + '$', sensitive ? '' : 'i');
}