const regex = /^(?=\s*SELECT\s+([\s\S]*?)(?=\s+(?:INTO|FROM|WHERE|GROUP\s+BY|HAVING|ORDER\s+BY)\s))(?=(?:[\s\S]*?\s+INTO\s+([\S]+)\s*)?)(?=(?:[\s\S]*?\s+FROM\s+([\s\S]*?)(?=\s+(?:WHERE|GROUP\s+BY|HAVING|ORDER\s+BY)\s)))(?=(?:[\s\S]*?\s+WHERE\s+([\s\S]*?)(?=\s+(?:GROUP\s+BY|HAVING|ORDER\s+BY)\s)))(?=(?:[\s\S]*?\s+GROUP\s+BY\s+([\s\S]*?)(?=\s+(?:HAVING|ORDER\s+BY)\s))?)(?=(?:[\s\S]*?\s+HAVING\s+([\s\S]*?)(?=\s+ORDER\s+BY\s))?)(?=(?:[\s\S]*?\s+ORDER\s+BY\s+([\s\S]*?)(?=\s*$))).*$/gm;
// Alternative syntax using RegExp constructor
// const regex = new RegExp('^(?=\\s*SELECT\\s+([\\s\\S]*?)(?=\\s+(?:INTO|FROM|WHERE|GROUP\\s+BY|HAVING|ORDER\\s+BY)\\s))(?=(?:[\\s\\S]*?\\s+INTO\\s+([\\S]+)\\s*)?)(?=(?:[\\s\\S]*?\\s+FROM\\s+([\\s\\S]*?)(?=\\s+(?:WHERE|GROUP\\s+BY|HAVING|ORDER\\s+BY)\\s)))(?=(?:[\\s\\S]*?\\s+WHERE\\s+([\\s\\S]*?)(?=\\s+(?:GROUP\\s+BY|HAVING|ORDER\\s+BY)\\s)))(?=(?:[\\s\\S]*?\\s+GROUP\\s+BY\\s+([\\s\\S]*?)(?=\\s+(?:HAVING|ORDER\\s+BY)\\s))?)(?=(?:[\\s\\S]*?\\s+HAVING\\s+([\\s\\S]*?)(?=\\s+ORDER\\s+BY\\s))?)(?=(?:[\\s\\S]*?\\s+ORDER\\s+BY\\s+([\\s\\S]*?)(?=\\s*$))).*$', 'gm')
const str = `SELECT
t1.dummy1,
t1.dummy2,
t1.dummy3
INTO
testResult
FROM
(test1 t1
INNER JOIN test2 t2 ON t1.dummy4 = t2.dummy4)
INNER JOIN test3 t3 ON t2.dummy9 = t3.dummy9
WHERE
t2.dummy6 = 'abc'
AND t3.dummy10 <> 'def'
AND t1.dummy11 = 'ghi'
AND t2.dummy12 IS NULL
HAVING 1=1
ORDER BY 1;`;
// Reset `lastIndex` if this regex is defined globally
// regex.lastIndex = 0;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for JavaScript, please visit: https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions