Java Regex在SQL注释中查找/替换模式

时间:2011-10-13 12:04:09

标签: 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 
        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


*/

你能否提出建议。

由于

3 个答案:

答案 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. 单个“* /”关闭所有当前打开的“/*”。
  2. 对于每个“/ *”,您需要一个相应的“* /”(嵌套注释)。
  3. 第一个相对容易实现。第二个只能通过深度魔法正则表达式(读取:未来编码器不可维护)或短程序来完成。

    第一个很简单:只要有嵌入的分号,使用“/\*.*;.*\*/”就会给你一个匹配。

    第二个需要一些编程。如果您遇到“;”,则需要检查您当前是否在评论中。您可以通过顺序读取文件(忽略回车/换行)并在遇到“/ *”时递增数字并在遇到“* /”时递减数字来了解。如果数字至少为1,则分号位于注释内。