复杂的正则表达式,仅用括号标识参数

时间:2015-02-20 10:07:19

标签: regex oracle plsql arguments

我正在尝试构建一个正则表达式,用于识别括号内的参数并忽略pl / sql注释(单行 - 和多行/ * * /)

例如:

create or replace table_name   ---sfjdslkfjslkfjslkfjdsfsdf

**(var1 in out number, var2 number)**

/* sdfls 
sfdsd jfs
 sfs f
sd f
sfsf */

AS 

BEGIN

(输出数量为var1,var2数字)应仅匹配。它还应考虑以下情况:

  • 没有评论(单行或多行)
  • 参数
  • 之前或之后只有单行注释
  • 参数
  • 之前或之后只有多行注释
  • 没有参数

假设:

  • 参数始终用括号()
  • 括起来
  • 程序有时可以没有参数,但在AS BEGIN子句之前有注释(单行或多行注释)
  • 程序从create or replace table_name
  • 开始
  • 我们只对阅读直到AS BEGIN条款
  • 感兴趣

换句话说,我需要找到第一个开头括号的索引('在任何注释之外(单行或多行)并且在AS BEGIN子句之前。

更新

我已设法使用以下正则表达式匹配评论:

(?:\/\*(?:[\s\S]*?)\*\/)|(?:\-\-(?:.*)$)

例如,它将匹配所有评论:

create or replace table_name 

-- sdlfksl kjs slkjslds js

/* lsdjfdkj 
s fskjfs
 sf sf
 sdf;;''
sfs fs
 */

 (hello number, var2 number)

 --sdflksf

 /*sl --sdflks s kdjfls())({fsfs */


AS

BEGIN

我现在可以用Java来识别任何匹配组之外的第一个开放括号。但是,如果我可以忽略匹配组并仅匹配括号中的一个参数,那将更容易。

修改

这不是要求使用pl / sql或sqlplus等解决方案。我有一些pl / sql程序存储在我需要修改并添加新参数的文件中。我使用Java来实现这一点,并使用循环和正则表达式的组合在Java im中。

2 个答案:

答案 0 :(得分:0)

不确定为什么要重新发明轮子。在Oracle中,您可以使用 * _ ARGUMENTS 视图来获取所有参数的列表。

例如,

SQL> CREATE OR REPLACE
  2  PROCEDURE p(
  3      in_date  DATE,
  4      out_text VARCHAR2)
  5  AS
  6  BEGIN
  7    NULL;
  8  END;
  9  /

Procedure created.

SQL>
SQL> SELECT object_name,
  2    package_name,
  3    argument_name,
  4    position,
  5    data_type
  6  FROM USER_ARGUMENTS
  7  WHERE OBJECT_NAME = 'P';

OBJECT_NAM PACKAGE_NA ARGUMENT_NAME     POSITION DATA_TYPE
---------- ---------- --------------- ---------- ---------
P                     OUT_TEXT                 2 VARCHAR2
P                     IN_DATE                  1 DATE

SQL>

答案 1 :(得分:0)

我不熟悉Oracle的正则表达式,但我制作了一个适用于大多数正则表达式引擎的模式。我知道MySQL的语法差异很大,所以Oracle的情况也很可能如此,但总体思路是:

create or replace table_name(?:(?!AS\s+BEGIN)(?:--[^\n]*(?:\n|$)|\/\*(?:[^*]|\*(?!\/))*\*\/|(?!\/\*|--)[^(]))*\(([^)]+)

Regular expression visualization

Debuggex Demo

"匹配,但上下文ABC" 方法也使用here并深入解释in this SO answer。结合我们匹配的任何内容后面都没有AS\s+BEGIN的要求。

您可以在Debuggex Demo中看到括号中正确的部分在捕获组1 中匹配。同样,第二个create没有参数,实际上没有任何匹配(即使评论中和AS BEGIN之后有括号。

目前的任务是将其移植到Oracle的正则表达式中。