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

Posted

技术标签:

【中文标题】SQL 注释中的 Java 正则表达式查找/替换模式【英文标题】:Java Regex find/replace pattern in SQL comments 【发布时间】: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


*/

你能不能给点建议。

谢谢

【问题讨论】:

【参考方案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 文件,当我遇到有注释的行时,我会检查该行是否在我的匹配列表中 - 如果不是,那么我会搜索替换;在整个评论中带有“”。当然,您必须找到注释的结束位置,但这很容易——在同一行和 /* 以及找到第一个 */ 时结束。这样您就可以更改任意数量的 ;使用相同的代码。

【讨论】:

这详细解释了我想要什么,并提供了一个解决方案ostermiller.org/findcomment.html。但是这个解决方案有一个很大的性能问题,这里讨论***.com/questions/462843/… 这似乎会捡起像 blah blah 【参考方案2】:

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

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

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

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

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

以上是关于SQL 注释中的 Java 正则表达式查找/替换模式的主要内容,如果未能解决你的问题,请参考以下文章

SQL查找和替换正则表达式捕获组限制?

Eclipse 用正则表达式查找/替换注释行

eclipsemyeclipse中删除所有注释正则表达式

Eclipse 用正则表达式查找/替换整行

什么是用于查找未注释 Java 代码行的正则表达式?

JAVA正则表达式匹配,替换,查找,切割(转)