首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Regex上使用“前瞻性”

如何在Regex上使用“前瞻性”
EN

Stack Overflow用户
提问于 2019-04-05 21:07:45
回答 3查看 100关注 0票数 0

我有一个sql脚本来创建或替换oracle上的包,我需要检查查询是否使用"user"."object“之类的Schema语法,以获得类似create或alter的指令。regex很简单,但在创建包的情况下,对我来说并不容易,因为在某些情况下,它可以包含"BODY“一词。

假设我的文件包含以下行(除其他外):

代码语言:javascript
复制
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行?

我试着用:

代码语言:javascript
复制
^CREATE\sOR\sREPLACE\sPACKAGE\s[a-zA-Z_0-9]+\s

但它会返回:

代码语言:javascript
复制
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

然后我试着用一个查找器“

代码语言:javascript
复制
CREATE\sOR\sREPLACE\sPACKAGE\s(?=BODY\s)[a-zA-Z_0-9]+\s

但也不起作用。

下面是一个脚本文件示例:

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-05 21:20:37

假设在通缉线中只有一个点,这似乎是可行的。如果变量$InStuff中有示例行,则会返回没有“Sometext”的两行。在他们身上..。

代码语言:javascript
复制
$InStuff -notmatch ' [a-z]+\.'

输出..。

代码语言:javascript
复制
CREATE OR REPLACE PACKAGE PKG_MASSIVE_SERVICE_AUTOMIC
CREATE OR REPLACE PACKAGE BODY PKG_MASSIVE_SERVICE_AUTOMIC
票数 2
EN

Stack Overflow用户

发布于 2019-04-05 22:12:20

要只匹配CREATE OR REPLACE PACKAGE ...行,其中...不包含(文字) . (仅由字母、数字、下划线和空格组成),只需确保regex与整行匹配即可。

代码语言:javascript
复制
(Get-Content some.sql) -match '^CREATE\sOR\sREPLACE\sPACKAGE\s[\sa-z_0-9]+$'

注意,我已经删除了不需要的A-Z,因为PowerShell的-match运算符不区分大小写(-cmatch可以用于区分大小写的匹配)。

票数 1
EN

Stack Overflow用户

发布于 2019-04-05 22:33:19

从字面上看问题标题,这是一个带有负前瞻 (?!.*\..*)的解决方案。

如果将较长的示例存储在文件.\some.sql中,则考虑到一行--CREATE...--在没有锚点^的情况下不会从第1行开始

代码语言:javascript
复制
(Get-Content .\some.sql) -match "CREATE\sOR\sREPLACE\sPACKAGE\s(BODY )?(?!.*\..*)"

产生这个输出。

代码语言:javascript
复制
CREATE OR REPLACE PACKAGE PKG_MASSIVE_SERVICE_AUTOMIC
 CREATE OR REPLACE PACKAGE BODY PKG_MASSIVE_SERVICE_AUTOMIC
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55543371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档