我想使用regexp_substr提取软件包名称。
例如:
创建或替换包主体something.pkg_test是
我想要那个
pkg_test
我试图使用lookbehind来忽略“创建或替换包主体内容”。
select regexp_substr('create or replace package body something.pkg_test is','((?<!create\sor\sreplace\spackage\sbody\ssomething\.).)*$',1,1) from dual;
但这不起作用。因此,我只需要提取“创建或替换包主体内容”与第一个空格或\ n之间的包名称。
我需要它,因为在编译.sql文件并将其插入表之前,我需要包名称。
答案 0 :(得分:4)
我的猜测是,也许您正在尝试写一些正向后看的表达式:
(?<=create\sor\sreplace\spackage\sbody\ssomething\.)\S*
或者,或者,我们可能会使用一些没有环顾四周的表达式,例如:
create\sor\sreplace\spackage\sbody\ssomething\.(\S*).*
具有捕获组1
,我们的代码可能类似于:
select regexp_replace('create or replace package body something.pkg_test is', 'create\sor\sreplace\spackage\sbody\ssomething\.(\S*).*', '\1') from dual;
虽然不确定。
该表达式在regex101.com的右上角进行了解释,如果您想探索/简化/修改它,在this link中,您可以观察到它如何与某些示例输入匹配,如果愿意的话。