-
Notifications
You must be signed in to change notification settings - Fork 24
Expand file tree
/
Copy pathbooleanParser.js
More file actions
65 lines (60 loc) · 1.98 KB
/
Copy pathbooleanParser.js
File metadata and controls
65 lines (60 loc) · 1.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
var parseStringAsXset = (s) => s
.split(/\s+\band\b\s+|(?<!\s+and\b)\s+\(|\)\s+(?!\band\b)/i)
.map(el=>
el.split(/\s+\bor\b\s+/i).map(ii=>
ii.replace(/\s*\)\s*/g,'')
.replace(/\s*\(\s*/g,'')
.replace(/\s+/g,'.{0,3}')
.replace(/"/g,'\\b')
.replace(/\*\*\*/g,'.{0,60}')
.replace(/\*/g,'.{0,1}'))
.reduce((a,b)=> a+'|'+b)).filter(el=> el).map(r=> r.replace(/\+/g,'\\+'));
function permutateNear(input,joiner){
var nearx = /(?<=\||^)\S+?(?=\||$)/g;
var base = input.replace(nearx, '').replace(/[\|]+/g, '|');
var near_or = input.match(nearx) ? input.match(nearx).map(str=> {
var arr = str.split(/~/);
if(arr.length > 5){
return str.replace(/[~]+/g,'.+?');
}else{
var cont = [];
var containArr = [];
function comboLoop(arr, cont){
if (arr.length == 0) {
var row = cont.join(joiner);
containArr.push(row)
}
for (var i = 0; i < arr.length; i++) {
var x = arr.splice(i, 1);
cont.push(x);
comboLoop(arr, cont);
cont.pop();
arr.splice(i, 0, x);
}
}
comboLoop(arr, cont);
return containArr.reduce((a,b)=> a+'|'+b);
}
}).flat().reduce((a,b)=> a+'|'+b) : '';
return base + near_or;
}
function buildSearchSet(str,flags){
if(str){
var set = parseStringAsXset(str);
var xset = set.map(r=> permutateNear(r,'.{0,49}')).map(r=> tryRegExp(r.replace(/^\||\|$/g,''),flags));
return xset;
}else{return null}
}
function tryRegExp(s,f){
try{return new RegExp(s,f)}
catch(err){return err}
}
function hasNestedParenth(s){
const reg = (o, n) => o ? o[n] : '';
let check_p = reg(/\(.+\(/.exec(s),0);
let opens = check_p.match(/\(/g);
let closes =check_p.match(/\)/g);
return !opens?.length ? false : closes?.length != ( opens?.length - 1);
}
buildSearchSet('one~two~three~four~five~six')
//fixed issue with max permutation