mirror of
https://github.com/JKorf/CryptoExchange.Net.git
synced 2026-08-23 06:13:09 +00:00
+74
@@ -0,0 +1,74 @@
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user