mirror of
				https://github.com/JKorf/CryptoExchange.Net
				synced 2025-11-04 04:17:32 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			75 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
export function escape(value) {
 | 
						|
  return new RegExp(value.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&'), 'm');
 | 
						|
}
 | 
						|
 | 
						|
export function source(re) {
 | 
						|
  // if it's a regex get it's source,
 | 
						|
  // otherwise it's a string already so just return it
 | 
						|
  return (re && re.source) || re;
 | 
						|
}
 | 
						|
 | 
						|
export function lookahead(regex) {
 | 
						|
  return concat('(?=', regex, ')');
 | 
						|
}
 | 
						|
 | 
						|
export function concat(...args) {
 | 
						|
  const joined = args.map((x) => source(x)).join("");
 | 
						|
  return joined;
 | 
						|
}
 | 
						|
 | 
						|
export function countMatchGroups(re) {
 | 
						|
  return (new RegExp(re.toString() + '|')).exec('').length - 1;
 | 
						|
}
 | 
						|
 | 
						|
export function startsWith(re, lexeme) {
 | 
						|
  var match = re && re.exec(lexeme);
 | 
						|
  return match && match.index === 0;
 | 
						|
}
 | 
						|
 | 
						|
// join logically computes regexps.join(separator), but fixes the
 | 
						|
// backreferences so they continue to match.
 | 
						|
// it also places each individual regular expression into it's own
 | 
						|
// match group, keeping track of the sequencing of those match groups
 | 
						|
// is currently an exercise for the caller. :-)
 | 
						|
export function join(regexps, separator) {
 | 
						|
  // backreferenceRe matches an open parenthesis or backreference. To avoid
 | 
						|
  // an incorrect parse, it additionally matches the following:
 | 
						|
  // - [...] elements, where the meaning of parentheses and escapes change
 | 
						|
  // - other escape sequences, so we do not misparse escape sequences as
 | 
						|
  //   interesting elements
 | 
						|
  // - non-matching or lookahead parentheses, which do not capture. These
 | 
						|
  //   follow the '(' with a '?'.
 | 
						|
  var backreferenceRe = /\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;
 | 
						|
  var numCaptures = 0;
 | 
						|
  var ret = '';
 | 
						|
  for (var i = 0; i < regexps.length; i++) {
 | 
						|
    numCaptures += 1;
 | 
						|
    var offset = numCaptures;
 | 
						|
    var re = source(regexps[i]);
 | 
						|
    if (i > 0) {
 | 
						|
      ret += separator;
 | 
						|
    }
 | 
						|
    ret += "(";
 | 
						|
    while (re.length > 0) {
 | 
						|
      var match = backreferenceRe.exec(re);
 | 
						|
      if (match == null) {
 | 
						|
        ret += re;
 | 
						|
        break;
 | 
						|
      }
 | 
						|
      ret += re.substring(0, match.index);
 | 
						|
      re = re.substring(match.index + match[0].length);
 | 
						|
      if (match[0][0] === '\\' && match[1]) {
 | 
						|
        // Adjust the backreference.
 | 
						|
        ret += '\\' + String(Number(match[1]) + offset);
 | 
						|
      } else {
 | 
						|
        ret += match[0];
 | 
						|
        if (match[0] === '(') {
 | 
						|
          numCaptures++;
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
    ret += ")";
 | 
						|
  }
 | 
						|
  return ret;
 | 
						|
}
 |