2011-10-13 44 views
1

我想在SQL註釋(單行註釋 - 和塊註釋/ * * /)內僅查找/替換字符/模式。源字符串是一個SQL腳本。Java正則表達式在SQL註釋中查找/替換模式

此刻,我正在搜索一個分號(;)內的評論,並希望用空格替換它。

來源

CREATE OR REPLACE PROCEDURE TESTDBA.PROC_REUSING_BINDED_VAR_N_DSQL 

AS 
     a NUMBER:=2; 
     b NUMBER:=3; -- jladjfljaf; lakjflajf 
-- alksdjflkjaf ladkjf 
     v_plsql_tx VARCHAR2(2000); 
    begin 
     v_plsql_tx := 'BEGIN ' || ' :1 := :1 + :2; ' || 'END;'; 
     execute immediate v_plsql_tx 
     using in out a, b; 
     insert into testdba.NEW_TESTING_TABLE(CHARACTER_VALUE) VALUES('a='||a); 
    end PROC_REUSING_BINDED_VAR_N_DSQL; 
-- lajdflajf 

/*lakjdfljalfdk; alkdjf*/ 

/*asdf 
; 
asdfa*/ 

/* 
    adf 
asd asdf 


*/ 

能否請您提出好的建議。

感謝

回答

3

我會做這樣的:

try { 
    Pattern regex = Pattern.compile("(?:/\\*[^;]*?\\*/)|(?:--[^;]*?$)", Pattern.DOTALL | Pattern.MULTILINE); 
    Matcher regexMatcher = regex.matcher(subjectString); 
    while (regexMatcher.find()) { 
     // matched text: regexMatcher.group() 
     // match start: regexMatcher.start() 
     // match end: regexMatcher.end() 
    } 
} catch (PatternSyntaxException ex) { 
    // Syntax error in the regular expression 
} 

上述會給你沒有所有的意見「;」。然後我會逐行遍歷sql文件,當我遇到一個有評論的行時,我會檢查該行是否在我的匹配列表中 - 如果沒有,那麼我會搜索替換;與''在整個評論。當然,你必須找到註釋結束的地方,但這很容易 - 結束於同一行和/ *,並在第一個* /被找到時結束。這樣你可以改變任何數量的;使用相同的代碼。

+0

這詳細解釋了我想要的,並提供瞭解決方案以及http://ostermiller.org/findcomment.html。但是這個解決方案有一個很大的性能問題,這裏討論http://stackoverflow.com/questions/462843/improving-fixing-a-regex-for-c-style-block-comments – Ali

+0

@Ali好東西,我們可以幫助: ) – FailedDev

+0

這似乎是拾取項目像等等等 –

1

也許是最好的辦法是使用兩個正則表達式和兩個模式(一個單行和一個多行)。

一行:\\-\\-[^;]*(;) - 不知道最好的方式到行內發現多個;

多行:/\\*[^;(\\*/)]*?(;)[^;]*?\\*/ - 這樣的事情反正

1

你需要弄清楚的第一件事:有是可以處理多行註釋的兩種方式。

  1. 單個「* /」關閉所有當前打開的「/ *」。
  2. 對於每個「/ *」,您需要一個相應的「* /」(嵌套註釋)。

第一個比較容易實現。第二個只能通過深度魔法正則表達式(閱讀:未來的編碼者不可維護)或者使用短程序來完成。

第一個很簡單:只要有嵌入分號,使用「/\*.*;.*\*/」會給你一個匹配。

第二個將需要一些編程。如果您遇到「;」,則需要檢查您目前是否在評論中。您只需按順序讀取文件(忽略回車/換行)並在遇到「/ *」時遞增數字,並在遇到「* /」時遞減數字。如果該數字至少爲1,則您的分號位於註釋中。