【问题标题】:How to extract the package name using regexp_substr如何使用 regexp_substr 提取包名
【发布时间】:2019-12-13 10:00:53
【问题描述】:

我想使用 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;

但它不起作用。所以我只需要在“create or replace package body something”和第一个空格或\n之间提取包名。

我需要它,因为我需要在编译 .sql 文件并将其插入表之前的包名。

【问题讨论】:

  • 如果你想检查一个包名,为什么不做一个简单的like检查而不是用正则表达式提取呢? if line like 'create%or%replace%package%body%something.pkg_test%' then ...。它不是万无一失的,但应该可以满足您的目的。
  • 我想在编译前提取包名并插入到一个表中。我只有 .sql 文件。不知道包名是什么。我把“check”这个词改成“想要包名”
  • 您可能还需要考虑可选关键字EDITIONABLENONEDITIONABLE。尽管几乎没有人关心它们,但很多工具会自动生成它们,并且它们可能会出现在 DDL 中。
  • @JonHeller 你说得有道理。我会考虑现在我知道该怎么做。

标签: sql regex plsql


【解决方案1】:

我的猜测是,也许你正试图用积极的后视写一些表达式:

(?<=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;

虽然不确定。

Demo 2


演示

表达式在regex101.com 的右上方面板中进行了解释,如果您想探索/简化/修改它,在this link 中,您可以查看它如何与一些示例输入进行匹配,如果您愿意的话。


参考

How to extract group from regular expression in Oracle?

【讨论】:

  • 这在您的链接中有效,但不适用于 regexp_subst。我不知道为什么。
猜你喜欢
  • 2018-07-05
  • 2021-09-16
  • 2012-06-26
  • 2021-04-23
  • 1970-01-01
  • 2012-01-11
  • 2021-08-04
  • 2020-10-10
  • 1970-01-01
相关资源
最近更新 更多