2016-02-26 35 views
1

我需要正則表達式來捕獲完整的「創建過程」語句。正則表達式for oracle「創建過程」定義

下面是一個例子,我用它來測試我的正則表達式:

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; 
/

當前正則表達式:

/CREATE\s+(OR\s+REPLACE\s+)?PROCEDURE\s+(\w+)\s*\(((?!.*\bEND\b\s*(\w+\s*)?\;\s*\/).*\s*)+.+/ 

至於我的問題:我用QRegularExpression類和程序未能當我運行它在大文件上。另外,當我在小文件上運行它時 - 所有工作都正常。

經過大量在線調試器的測試後,如regexr.com,我找不到正則表達式的問題。

我該如何改變它,哪裏可能會出現問題?

+2

正則表達式可能是一個很好的工具來查找事物,但解析複雜的代碼,不管它應該是'html','sql'還是其他什麼,都不應該用它來完成。 如果你在聲明中定義了一個方法,那麼你會需要重寫整個正則表達式,並且它會很快被讀取,並且不可維護,並且可能會導致一些「bug」。 – SomeJavaGuy

+0

嘗試['CREATE \ s +(OR \ s + REPLACE \ s +)?PROCEDURE \ s +(\ w +)\ s * \([^ \ n] +(?:\ n(?!END; \ n)[^ \ nEND;'](https://regex101.com/r/tV8bW4/1)它基於展開循環技術,應該更加高效。請注意,你的鍛鍊正則表達式令牌是自從你在lookahead部分中檢查'。*'後就會斷掉,如果有效,我會在後面解釋。 –

回答

0

嘗試一些非常簡單的,如:

CREATE(\s+OR\s+REPLACE)\s+PROCEDURE.*?END;\s*/ 

它只是看起來爲CREATE OR REPLACE PROCEDURE在開始,然後年底將END;其次/(指示PL/SQL塊中的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+OR\s+REPLACE)\s+PROCEDURE.*?END;\s*/$', 'n'); 

輸出

COUNT(*) 
-------- 
     1