正则表达式在具有 0 个或多个 UNION 的单个语句中捕获多组 SELECT 查询?

Regex to capture multiple groups of SELECT queries in a single statement with 0 or more UNIONs?

我有一个 SQL 查询列表,范围从简单的

SELECT * from ABC

这样复杂的

SELECT A,B,C from ABC Where Z=5 and T=10 UNION SELECT * from GHI Where i=100 UNION SELECT X,Y from XYZ

我想使用正则表达式捕获粗体部分。目前,我有 (SELECT[\s]*.*from[\s]*),但这将第二个查询视为单个 SELECT 查询,即 SELECT .... from XYZ,而我需要它来查找上面突出显示的 3 个部分。

有好心人可以给点建议吗?谢谢。

以下模式在 case-insensitive 模式下几乎适用于任何语言:

SELECT\s(?:(?!FROM)[\s\S])*\sFROM

这甚至在 SQL 代码分布在多行时也有效。

Demo

或者,启用 single-line 模式并只使用一个点:SELECT\s(?:(?!FROM).)*\sFROM.