irongit

A better version of regex 101

moonregex/src/builder.js
47 lines1.3 KBJavaScript
1const parseBuilder = (str) => {
2 let lines = str.split("\n");
3 const ref = {};
4 for (let line of lines) {
5 if (!line.trim()) continue;
6 const r =
7 /^(?<tabs>\s*)(?<name>\w*)(?<optional>\??)(?<type>[:>])(?<regex>.*)/.exec(
8 line
9 );
10 if (!r) return "";
11 const lineData = r.groups;
12 console.log(lineData);
13 const tabs = lineData.tabs.length;
14 if (!ref[tabs]) ref[tabs] = [lineData];
15 else ref[tabs].push(lineData);
16 if (tabs) {
17 const parentRefInd = ref[tabs - 1].length - 1;
18 let parent = ref[tabs - 1][parentRefInd];
19 if (!parent.children) parent.children = [lineData];
20 else parent.children.push(lineData);
21 }
22 }
23 return buildToRegex(ref[0]);
24};
25
26const buildToRegex = (build) => {
27 const re = buildToRegexRecursion(build, "");
28 return re;
29};
30
31const buildToRegexRecursion = (build, re) => {
32 if (!build?.length) return re;
33 const val = build.shift();
34 if (val.type === ":") {
35 if (val.name) re += `(?P<${val.name}>${val.regex}`;
36 else re += `(?:${val.regex}`;
37 if (val.children) re += buildToRegexRecursion(val.children, "");
38 re += `)${val.optional}`;
39 } else if (val.type === ">") {
40 re += val.regex;
41 if (val.children) re += buildToRegexRecursion(val.children, "");
42 }
43
44 return buildToRegexRecursion(build, re);
45};
46
47export default parseBuilder;