正则表达式捕获WHERE子句

时间:2019-02-20 15:18:19

标签: regex oracle

这个问题看起来很简单,但对我而言却并非如此。有几个Dll我想知道他们的条件。因此:

INSERT INTO TABLE_1 (COL_1,
                     COL_2,
                     COL_3)
SELECT 1,2,3 FROM DUAL WHERE (SOME CONDITIONS);

INSERT INTO TABLE_2 (COL_1,
                     COL_2,
                     COL_3)
SELECT 1,2,3 FROM DUAL WHERE
    ONE CONDITION;

INSERT INTO TABLE_3 (COL_1,
                     COL_2,
                     COL_3)
SELECT 1,2,3 FROM DUAL WHERE
    ONE CONDITION OR SECOND CONDITION;

我需要以某种方式捕获: (某些条件)  一个条件 一个条件或第二个条件;

我认为就足够了:WHERE(.*\n)*; 不仅如此,许多其他变体也没有。我做错了什么? 我用来测试的工具是:https://regex101.com/

2 个答案:

答案 0 :(得分:1)

WHERE[ \r\n]*(.*?);应该适合您。 它将WHERE后面的所有内容与可能不匹配的空格或换行符匹配,直到出现;为止,最少可能出现一次(?

see example in regex101 here

此外,您可以包含s-Flag以在.中包含换行符(如我的示例所示)

您的子句是第一个被捕获的组。

答案 1 :(得分:1)

您可以通过命名组的递归匹配使用正则表达式:

WHERE\s+(?&TEXT)
(?(DEFINE)
   (?<WORD>        \s*[a-zA-Z0-9_,.=<>-]+? )
   (?<BRACKETED>   \s*\((?&NESTED_TEXT)\s*\) )
   (?<NESTED_TEXT> (?:(?&WORD)|(?&BRACKETED))+ )
   (?<TEXT>        (?:(?!\s*GROUP\s+BY|\s*ORDER\s+BY)(?&WORD)|(?&BRACKETED))+ )
)

(带有不区分大小写的i和扩展的x标志)

regex101

Oracle的正则表达式功能不支持此功能,但是如果您尝试使用另一种语言的正则表达式(确实支持此功能)来匹配Oracle DML语句,则它可以工作。

可能需要进一步的工作来排除UNION或解析子查询因式子句或双引号标识符。