我需要正则表达式来捕获完整的"创建过程"语句。
这是我用来测试正则表达式的示例之一:
CREATE OR REPLACE PROCEDURE sp_for_comp (P_VARNAME IN VARCHAR2, P_VALUE IN OUT NUMBER)
as
v_if_exists NUMBER(10,0);
BEGIN
SELECT COUNT(*) INTO v_if_exists FROM PKG_VAR WHERE VARIABLENAME = P_VARNAME;
IF v_if_exists > 0
THEN
begin
SELECT VALUE INTO P_VALUE FROM PKG_VAR WHERE VARIABLENAME = P_VARNAME;
EXCEPTION
WHEN OTHERS THEN
NULL;
end;
ELSE
begin
INSERT INTO PKG_VAR VALUES(P_VARNAME, P_VALUE);
EXCEPTION
WHEN OTHERS THEN
NULL;
end;
END IF;
END;
/
当前正则表达式:
/CREATEs+(ORs+REPLACEs+)?PROCEDUREs+(w+)s*(((?!.*bENDbs*(w+s*)?;s*/).*s*)+.+/
至于我的问题:我使用 QRegularExpression 类,当我在大文件上运行它时程序失败。另外,当我在小文件上运行它时 - 一切正常。
在对在线调试器(如 regexr.com)进行了大量测试后,我找不到正则表达式中的问题。
我应该如何改变它,哪里可能有问题?
尝试一些非常简单的事情,例如:
CREATE(s+ORs+REPLACE)s+PROCEDURE.*?END;s*/
它只是在开头查找CREATE OR REPLACE PROCEDURE
,然后结束将END;
后跟下一行的/
(指示 SQL 作用域中 PL/SQL 块的结束),两者之间的量最小。
(注意:您可能希望使用 ni
正则表达式匹配参数,以允许.
匹配换行符并执行不区分大小写的匹配。
示例:
CREATE TABLE script (value ) AS
SELECT 'CREATE OR REPLACE PROCEDURE sp_for_comp (P_VARNAME IN VARCHAR2, P_VALUE IN OUT NUMBER)' || CHR(10)
|| ' as' || CHR(10)
|| ' v_if_exists NUMBER(10,0);' || CHR(10)
|| 'BEGIN' || CHR(10)
|| ' SELECT COUNT(*) INTO v_if_exists FROM PKG_VAR WHERE VARIABLENAME = P_VARNAME;' || CHR(10)
|| ' IF v_if_exists > 0' || CHR(10)
|| ' THEN' || CHR(10)
|| ' begin' || CHR(10)
|| ' SELECT VALUE INTO P_VALUE FROM PKG_VAR WHERE VARIABLENAME = P_VARNAME;' || CHR(10)
|| ' EXCEPTION' || CHR(10)
|| ' WHEN OTHERS THEN' || CHR(10)
|| ' NULL;' || CHR(10)
|| ' end;' || CHR(10)
|| 'ELSE' || CHR(10)
|| ' begin' || CHR(10)
|| ' INSERT INTO PKG_VAR VALUES(P_VARNAME, P_VALUE);' || CHR(10)
|| ' EXCEPTION' || CHR(10)
|| ' WHEN OTHERS THEN' || CHR(10)
|| ' NULL;' || CHR(10)
|| ' end;' || CHR(10)
|| ' END IF;' || CHR(10)
|| 'END;' || CHR(10)
|| '/'
FROM DUAL;
SELECT COUNT(*)
FROM script
WHERE REGEXP_LIKE( value, '^CREATE(s+ORs+REPLACE)s+PROCEDURE.*?END;s*/$', 'n' );
输出:
COUNT(*)
--------
1