【问题标题】:Java Regex find/replace pattern in SQL commentsSQL 注释中的 Java 正则表达式查找/替换模式
【发布时间】:2011-12-06 22:02:51
【问题描述】:

我只想在 SQL cmets 中查找/替换字符/模式(单行 cmets -- 和块 cmets /* */)。源字符串是一个 SQL 脚本。

目前我正在 cmets 中搜索分号 (;),并希望将其替换为空格。

来源

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


*/

你能不能给点建议。

谢谢

【问题讨论】:

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

    以上内容将为您提供所有不带“;”的 cmets。然后我会逐行遍历 sql 文件,当我遇到有注释的行时,我会检查该行是否在我的匹配列表中 - 如果不是,那么我会搜索替换;在整个评论中带有“”。当然,您必须找到注释的结束位置,但这很容易——在同一行和 /* 以及找到第一个 */ 时结束。这样您就可以更改任意数量的 ;使用相同的代码。

    【讨论】:

    【解决方案2】:

    你需要先搞清楚:多线cmets有两种处理方式。

    1. 单个“*/”关闭所有当前打开的“/*”。
    2. 对于每个“/*”,您需要一个对应的“*/”(嵌套 cmets)。

    第一个相对容易实现。第二个只能通过深度魔术正则表达式(阅读:未来的编码人员无法维护)或短程序来完成。

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2014-01-27
        • 2012-05-18
        • 2014-10-15
        • 2013-08-22
        • 1970-01-01
        • 1970-01-01
        • 2013-08-14
        • 1970-01-01
        相关资源
        最近更新 更多