2015-01-21 73 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

相关问题