Регулярное выражение для захвата предложения WHERE - PullRequest
0 голосов
/ 20 февраля 2019

этот вопрос может показаться легким, но для меня это не так.Имея пару ddls, я хочу получить их, где условия.Так что для:

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 голосов
/ 20 февраля 2019

Вы можете использовать регулярное выражение, используя рекурсивные совпадения именованных групп:

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 или для синтаксического анализа предложений факторинга подзапроса или идентификаторов в двойных кавычках.

0 голосов
/ 20 февраля 2019

WHERE[ \r\n]*(.*?); должно работать нормально для вас.Он сопоставляет все, что находится за WHERE, с возможными несоответствующими пробелами или символами новой строки, пока не появится ;, наименьшее возможное время (?)

см. Пример в regex101 здесь

Кроме того, вы можете включить s-Flag, чтобы включить новые строки с . (как показано в моем примере)

Ваше предложение является первой захваченной группой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...