SQL注释中的Java正则表达式查找/替换模式
我只想在SQL注释(单行注释和块注释/**/)中查找/替换字符/模式。源字符串是一个SQL脚本 目前,我正在搜索注释中的分号(;),并希望将其替换为空白 来源SQL注释中的Java正则表达式查找/替换模式,java,regex,Java,Regex,我只想在SQL注释(单行注释和块注释/**/)中查找/替换字符/模式。源字符串是一个SQL脚本 目前,我正在搜索注释中的分号(;),并希望将其替换为空白 来源 CREATE OR REPLACE PROCEDURE TESTDBA.PROC_REUSING_BINDED_VAR_N_DSQL AS a NUMBER:=2; b NUMBER:=3; -- jladjfljaf; lakjflajf -- alksdjflkjaf ladkjf
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
*/
你能给我提个建议吗
谢谢也许最好的选择是使用两个正则表达式和两种模式(一行和一行) 单行:
\-\-[^;]*(;)
--不确定查找多个的最佳方法代码>在一行内
多行:/\\*[^;(\\*/)]*?(;)[^;]*?\*/
——反正是这样的可能最好的办法是使用两个正则表达式和两种模式(一行和一行)
单行:\-\-[^;]*(;)
--不确定查找多个的最佳方法代码>在一行内
多行:/\\*[^;(\\*/)]*?(;)[^;]*?\*/
——总之是这样的,您首先需要了解的是:有两种方法可以处理多行注释
单个“*/”关闭所有当前打开的“/*”
对于每个“/*”,您都需要相应的“*/”(嵌套注释)
第一个相对容易实现。第二种方法只能由deep magic regex(读:未来的编码人员无法维护)或一个简短的程序来完成
第一个很简单:只要有一个内嵌分号,使用“/\*.*;*\*/”就可以匹配
第二个需要一点编程。如果您遇到“;”,则需要检查您当前是否在评论中。您只需依次读取文件(忽略回车/换行符)并在遇到“/*”时递增一个数字,在遇到“*/”时递减一个数字即可知道。如果数字至少为1,则分号在注释中。首先需要了解的是:有两种方法可以处理多行注释
单个“*/”关闭所有当前打开的“/*”
对于每个“/*”,您都需要相应的“*/”(嵌套注释)
第一个相对容易实现。第二种方法只能由deep magic regex(读:未来的编码人员无法维护)或一个简短的程序来完成
第一个很简单:只要有一个内嵌分号,使用“/\*.*;*\*/”就可以匹配
第二个需要一点编程。如果您遇到“;”,则需要检查您当前是否在评论中。您只需依次读取文件(忽略回车/换行符)并在遇到“/*”时递增一个数字,在遇到“*/”时递减一个数字即可知道。如果数字至少为1,则分号在注释中。我会这样做:
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文件,当我遇到一行有注释的行时,我会检查该行是否在我的匹配列表中——如果没有,那么我会搜索替换;在整个注释中使用“”。当然,您必须找到注释的结尾,但这很容易——在同一行中结束,/*并且在找到第一个*/时结束。通过这种方式,您可以更改任意数量的;使用相同的代码。我会这样做:
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文件,当我遇到一行有注释的行时,我会检查该行是否在我的匹配列表中——如果没有,那么我会搜索替换;在整个注释中使用“”。当然,您必须找到注释的结尾,但这很容易——在同一行中结束,/*并且在找到第一个*/时结束。通过这种方式,您可以更改任意数量的;使用相同的代码。这详细解释了我想要什么,并提供了解决方案。但是这个解决方案有一个很大的性能问题,我们在这里讨论过,这似乎是一些琐碎的东西,这详细解释了我想要什么,并提供了一个解决方案。但是这个解决方案有一个很大的性能问题,我们在这里讨论了这个问题,这似乎是胡说八道