这个问题看起来很简单,但对我而言却并非如此。有几个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/
答案 0 :(得分:1)
WHERE[ \r\n]*(.*?);
应该适合您。
它将WHERE后面的所有内容与可能不匹配的空格或换行符匹配,直到出现;
为止,最少可能出现一次(?
)
此外,您可以包含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
标志)
Oracle的正则表达式功能不支持此功能,但是如果您尝试使用另一种语言的正则表达式(确实支持此功能)来匹配Oracle DML语句,则它可以工作。
可能需要进一步的工作来排除UNION
或解析子查询因式子句或双引号标识符。