mirror of
				https://github.com/JKorf/CryptoExchange.Net
				synced 2025-10-30 18:07:42 +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;
 | |
| }
 |