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,我找不到正則表達式的問題。
我該如何改變它,哪裏可能會出現問題?
正則表達式可能是一個很好的工具來查找事物,但解析複雜的代碼,不管它應該是'html','sql'還是其他什麼,都不應該用它來完成。 如果你在聲明中定義了一個方法,那麼你會需要重寫整個正則表達式,並且它會很快被讀取,並且不可維護,並且可能會導致一些「bug」。 – SomeJavaGuy
嘗試['CREATE \ s +(OR \ s + REPLACE \ s +)?PROCEDURE \ s +(\ w +)\ s * \([^ \ n] +(?:\ n(?!END; \ n)[^ \ nEND;'](https://regex101.com/r/tV8bW4/1)它基於展開循環技術,應該更加高效。請注意,你的鍛鍊正則表達式令牌是自從你在lookahead部分中檢查'。*'後就會斷掉,如果有效,我會在後面解釋。 –