SQL注释中的Java正则表达式查找/替换模式

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

我只想在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


*/
你能给我提个建议吗


谢谢

也许最好的选择是使用两个正则表达式和两种模式(一行和一行)

单行:
\-\-[^;]*(;)
--不确定查找多个
的最佳方法在一行内


多行:
/\\*[^;(\\*/)]*?(;)[^;]*?\*/
——反正是这样的

可能最好的办法是使用两个正则表达式和两种模式(一行和一行)

单行:
\-\-[^;]*(;)
--不确定查找多个
的最佳方法在一行内


多行:
/\\*[^;(\\*/)]*?(;)[^;]*?\*/
——总之是这样的,您首先需要了解的是:有两种方法可以处理多行注释

  • 单个“*/”关闭所有当前打开的“/*”
  • 对于每个“/*”,您都需要相应的“*/”(嵌套注释)
  • 第一个相对容易实现。第二种方法只能由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文件,当我遇到一行有注释的行时,我会检查该行是否在我的匹配列表中——如果没有,那么我会搜索替换;在整个注释中使用“”。当然,您必须找到注释的结尾,但这很容易——在同一行中结束,/*并且在找到第一个*/时结束。通过这种方式,您可以更改任意数量的;使用相同的代码。

    这详细解释了我想要什么,并提供了解决方案。但是这个解决方案有一个很大的性能问题,我们在这里讨论过,这似乎是一些琐碎的东西,这详细解释了我想要什么,并提供了一个解决方案。但是这个解决方案有一个很大的性能问题,我们在这里讨论了这个问题,这似乎是胡说八道