У меня есть сценарий sql для создания или замены пакетов в оракуле, и мне нужно проверить, находится ли запрос в синтаксисе схемы, например «пользователь». «объект», для инструкций, таких как «Создать или изменить таблицу». Регулярное выражение простое, но в случае создания пакета для меня это не так просто, потому что в некоторых случаях оно может включать слово «ТЕЛО».
Предположим, что мой файл содержит следующие строки (среди прочего):
CREATE OR REPLACE PACKAGE PKG_MASSIVE_SERVICE_AUTOMIC
CREATE OR REPLACE PACKAGE AUTOMIC.PKG_MASSIVE_SERVICE_AUTOMIC
CREATE OR REPLACE PACKAGE BODY PKG_MASSIVE_SERVICE_AUTOMIC
CREATE OR REPLACE PACKAGE BODY AUTOMIC.PKG_MASSIVE_SERVICE_AUTOMIC
Вторая и четыре строки являются единственными допустимыми, как я могу сопоставить только запросы неверный, то есть строки 1 и 3?
Я пытался использовать:
^CREATE\sOR\sREPLACE\sPACKAGE\s[a-zA-Z_0-9]+\s
Но он возвращает:
CREATE OR REPLACE PACKAGE PKG_MASSIVE_SERVICE_AUTOMIC
CREATE OR REPLACE PACKAGE BODY PKG_MASSIVE_SERVICE_AUTOMIC
CREATE OR REPLACE PACKAGE BODY AUTOMIC.PKG_CLAUSE_TIME_V1_241_AUTOMIC
Затем я попытался использовать ретроспективу"
CREATE\sOR\sREPLACE\sPACKAGE\s(?=BODY\s)[a-zA-Z_0-9]+\s
но тоже не работает.
Вот пример файла сценария:
CREATE OR REPLACE PACKAGE PKG_MASSIVE_SERVICE_AUTOMIC
IS
Type REF_CUR Is Ref Cursor;
PROCEDURE PRC_GETACTIVATIONINFO_ARUS
(
VIDACTIVACION IN NUMBER,
RES_CURSOR OUT REF_CUR
);
PROCEDURE PRC_GETPAYMENTINFO_ARUS
(
VIDACTIVACION IN NUMBER,
RES_CURSOR OUT REF_CUR
);
PROCEDURE PRC_GETACTIVAPROCESSINFO_ARUS
(
VIDACTIVACION IN NUMBER,
RES_CURSOR OUT REF_CUR
);
PROCEDURE PRC_UPDATEPAGOS_ARUS
(
VIDACTIVACION IN NUMBER,
VIDPAGOSACTIVACION IN NUMBER
);
PROCEDURE PRC_GETACTPROCSBILLINGINF_ARUS
(
VIDACTIVACION IN NUMBER,
RES_CURSOR OUT REF_CUR
);
END;
/
CREATE OR REPLACE PACKAGE BODY PKG_MASSIVE_SERVICE_AUTOMIC
IS
PROCEDURE PRC_GETACTIVATIONINFO_ARUS
предполагая, что в разыскиваемой строке есть только ОДНА точка, это, кажется, работает. [ухмылка] если у вас есть образцы строк в переменной $InStuff
, возвращаются две строки, в которых НЕТ « Sometext ». в них ...
$InStuff -notmatch ' [a-z]+\.'
выход ...
CREATE OR REPLACE PACKAGE PKG_MASSIVE_SERVICE_AUTOMIC
CREATE OR REPLACE PACKAGE BODY PKG_MASSIVE_SERVICE_AUTOMIC
Спасибо за ответ, но более реальный сценарий содержит строки без точек.
добро пожаловать [ухмылка] .... но вы должны предоставить РЕАЛИСТИЧНЫЕ образцы и то, что такое "хороший образец". в вашем описании указан "user"."object"
и теперь это недействительно. [вздох ...]
Привет, извините за ошибку, я уже обновляю вопрос более реалистичным сценарием. Спасибо
@LordBacteria - на самом деле вы не предоставили то, что было запрошено, и то, что кажется нужный [вздох ...] ... несколько строк образцов с некоторыми критериями, чтобы решить, что соответствует / не соответствует.
привет, я снова проверил, используя notmatch, и это работает, спасибо.
@LordBacteria - круто! Вы очень кстати! рад узнать, что у вас все работает так, как вам нужно... [ухмылка]
@LordBacteria: Хотя Ли заслуживает похвалы за предоставление полезного указателя (у которого был мой +1) прежде чем вы - к сожалению с опозданием - уточнили ваши точные требования , его ответ в настоящее время не решает вашу проблему, представленную сейчас, поэтому его принятие может сбить с толку будущих читателей. Пересмотр ответа, чтобы рекомендовать подход двухходовой - использование -match
первый для сопоставления ^CREATE ...
строк и тогда, исключая те нет, содержащие литерал .
через -notmach
, является жизнеспособным решением, но если ответ на самом деле не показывает это, его не стоит принимать.
Чтобы сопоставить только CREATE OR REPLACE PACKAGE ...
строк, где ...
нет содержит (литерал) .
(хотя он состоит только из букв, цифр, знаков подчеркивания и пробелов), вам просто нужно убедиться, что ваше регулярное выражение соответствует полная линия:
(Get-Content some.sql) -match '^CREATE\sOR\sREPLACE\sPACKAGE\s[\sa-z_0-9]+$'
Обратите внимание, что я удалил A-Z
, который не нужен, потому что оператор -match
в PowerShell — это case-бесчувственный (-cmatch
можно использовать для сопоставления case-чувствительный).
Буквально воспринимая название вашего вопроса, решение с негативный взгляд вперед(?!.*\..*)
С вашим более длинным образцом, хранящимся в файле .\some.sql
, учитывая, что одна строка - CREATE...
- не начинается в 1-м столбце без привязки ^
(Get-Content .\some.sql) -match "CREATE\sOR\sREPLACE\sPACKAGE\s(BODY )?(?!.*\..*)"
дает этот результат.
CREATE OR REPLACE PACKAGE PKG_MASSIVE_SERVICE_AUTOMIC
CREATE OR REPLACE PACKAGE BODY PKG_MASSIVE_SERVICE_AUTOMIC
Итак,
(Body )?
необязателен, ноAUTOMATIC.+
обязателен?