我正在尝试构建一个正则表达式,用于识别括号内的参数并忽略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数字)应仅匹配。它还应考虑以下情况:
假设:
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中。
答案 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|$)|\/\*(?:[^*]|\*(?!\/))*\*\/|(?!\/\*|--)[^(]))*\(([^)]+)
"匹配此,但上下文A
,B
或C
" 方法也使用here并深入解释in this SO answer。结合我们匹配的任何内容后面都没有AS\s+BEGIN
的要求。
您可以在Debuggex Demo中看到括号中正确的部分在捕获组1 中匹配。同样,第二个create
没有参数,实际上没有任何匹配(即使评论中和AS BEGIN
之后有括号。
目前的任务是将其移植到Oracle的正则表达式中。