2015-01-21 100 views
1

我得到了包含20,000多行的SQL文件。 sql由程序ddl和dml組成。我發現一個'更快'的方式來分割文件...將單個文件拆分爲多個文件

所以我想創建一個腳本,根據功能拆分內容。以下是我的正則表達式:

String sp_regex = "(CREATE OR REPLACE PROCEDURE) .+(SHOW ERRORS;)$"; 
String insert_regex = "(INSERT INTO) .+(SHOW ERRORS;)$"; 
String delete_regex = "(DELETE FROM) .+([)];)$"; 
String table_regex = "(CREATE TABLE) .+([)];)$"; 

但是沒有一個正則表達式正在工作。內容根本沒有分裂。我的正則表達式有什麼問題?

樣品SQL:

CREATE OR REPLACE PROCEDURE "SCHEMA"."SP" (
...... 
); 
/
SHOW ERRORS; 

CREATE TABLE "SCHEMA"."TABLE" (
...... 
); 

INSERT INTO "SCHEMA"."TABLE" (......) VALUES ("......"); 

DELETE FROM "SCHEMA"."TABLE" WHERE ..... = "...."; 
+0

很難說不知道你的文件是怎麼樣的以及你如何使用正則表達式。我的猜測是你沒有使用'Pattern.MULTILINE'選項編譯正則表達式,因此'$'只匹配字符串的末尾,而不是每行的末尾。 – 2015-01-21 11:41:11

+0

我在文件@TimPietzcker中添加了示例sql格式。 – Chin 2015-01-21 11:50:40

回答

0

你應該讓.匹配換行符,並允許$匹配行結束(不只是EOF)。如果你這樣做,你也將需要使+量詞懶爲了告訴它停止在儘可能早的點匹配:

String sp_regex = "(?sm)(CREATE OR REPLACE PROCEDURE) .+?(SHOW ERRORS;)$"; 
String insert_regex = "(?sm)(INSERT INTO) .+?(SHOW ERRORS;)$"; 
String delete_regex = "(?sm)(DELETE FROM) .+?([)];)$"; 
String table_regex = "(?sm)(CREATE TABLE) .+?([)];)$"; 

您需要進行全面測試這一點 - 不匹配任何行這些正則表達式只會被忽略。

+0

是的,我同意你的意見。必須徹底測試,因爲sql中有不同類型的編碼風格。順便說一句,感謝提示,現在它效果更好。仍在編輯正則表達式。 – Chin 2015-01-21 14:18:26

+0

我用'Pattern'和'Matcher'代替'split()',同時'split()'用於'「schema」。「[name]」'以後爲sql獲取'name'。謝謝蒂姆。 – Chin 2015-01-21 17:25:08