Как использовать Lookahead в Regex

У меня есть сценарий 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

Итак, (Body )? необязателен, но AUTOMATIC.+ обязателен?

user6811411 05.04.2019 23:19
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
95
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

предполагая, что в разыскиваемой строке есть только ОДНА точка, это, кажется, работает. [ухмылка] если у вас есть образцы строк в переменной $InStuff, возвращаются две строки, в которых НЕТ « Sometext ». в них ...

$InStuff -notmatch ' [a-z]+\.'

выход ...

CREATE OR REPLACE PACKAGE PKG_MASSIVE_SERVICE_AUTOMIC
CREATE OR REPLACE PACKAGE BODY PKG_MASSIVE_SERVICE_AUTOMIC

Спасибо за ответ, но более реальный сценарий содержит строки без точек.

LordBacteria 05.04.2019 23:34

добро пожаловать [ухмылка] .... но вы должны предоставить РЕАЛИСТИЧНЫЕ образцы и то, что такое "хороший образец". в вашем описании указан "user"."object" и теперь это недействительно. [вздох ...]

Lee_Dailey 05.04.2019 23:51

Привет, извините за ошибку, я уже обновляю вопрос более реалистичным сценарием. Спасибо

LordBacteria 06.04.2019 00:09

@LordBacteria - на самом деле вы не предоставили то, что было запрошено, и то, что кажется нужный [вздох ...] ... несколько строк образцов с некоторыми критериями, чтобы решить, что соответствует / не соответствует.

Lee_Dailey 06.04.2019 00:24

привет, я снова проверил, используя notmatch, и это работает, спасибо.

LordBacteria 06.04.2019 00:30

@LordBacteria - круто! Вы очень кстати! рад узнать, что у вас все работает так, как вам нужно... [ухмылка]

Lee_Dailey 06.04.2019 00:38

@LordBacteria: Хотя Ли заслуживает похвалы за предоставление полезного указателя (у которого был мой +1) прежде чем вы - к сожалению с опозданием - уточнили ваши точные требования , его ответ в настоящее время не решает вашу проблему, представленную сейчас, поэтому его принятие может сбить с толку будущих читателей. Пересмотр ответа, чтобы рекомендовать подход двухходовой - использование -matchпервый для сопоставления ^CREATE ... строк и тогда, исключая те нет, содержащие литерал . через -notmach, является жизнеспособным решением, но если ответ на самом деле не показывает это, его не стоит принимать.

mklement0 06.04.2019 03:29

Чтобы сопоставить только 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

Другие вопросы по теме