繁体   English   中英

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

[英]Java Regex find/replace pattern in SQL comments

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


*/

你能建议点什么吗?

谢谢

我会这样做:

    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文件,当我遇到一行带有注释的行时,我将检查该行是否在我的匹配项列表中-如果没有,则将搜索replace; 整个注释中带有“”。 当然,您将必须找到注释的结尾位置,但这很容易-在同一行和/ *处以及在找到第一个* /时结束。 这样,您可以更改任何数量的; 具有相同的代码。

最好的选择是使用两个正则表达式和两个模式(一个单行和一个多行)。

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

多行: /\\\\*[^;(\\\\*/)]*?(;)[^;]*?\\\\*/ -无论如何

首先需要了解的内容:处理多行注释的方式有两种。

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

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

第一个很简单:只要有嵌入式分号,使用“ /\\*.*;..*\\*/”就会为您提供匹配。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM