我想在SQL注释中找到/替换字符/模式(单行注释 - 和阻止注释/ * * /)。源字符串是一个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
*/
你能否提出建议。
由于
答案 0 :(得分: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文件,当我遇到一条有评论的行时,我会检查该行是否在我的匹配列表中 - 如果不是那么我会搜索替换;与''在整个评论中。当然,您必须找到评论结束的位置,但这很容易 - 在同一行和/ *以及找到第一个* /时结束。这样你可以改变任意数量;使用相同的代码。
答案 1 :(得分:1)
最好的办法是使用两个正则表达式和两个模式(一行和一行)。
单行:\\-\\-[^;]*(;)
- 不确定在一行中找到多个;
的最佳方法
多行:/\\*[^;(\\*/)]*?(;)[^;]*?\\*/
- 无论如何都是这样的
答案 2 :(得分:1)
首先需要了解的内容:有两种方法可以处理多行注释。
第一个相对容易实现。第二个只能通过深度魔法正则表达式(读取:未来编码器不可维护)或短程序来完成。
第一个很简单:只要有嵌入的分号,使用“/\*.*;.*\*/”就会给你一个匹配。
第二个需要一些编程。如果您遇到“;”,则需要检查您当前是否在评论中。您可以通过顺序读取文件(忽略回车/换行)并在遇到“/ *”时递增数字并在遇到“* /”时递减数字来了解。如果数字至少为1,则分号位于注释内。