[Java/SQL/Utils] SQL注释清除工具:SqlCommentStripper

1 概述:SQL注释清除

  • 清除SQL注释的场景
  • 情况1:对于数据中台、查询引擎而言,对SQL脚本中注释的清除,是必须考虑的一个问题。
  • 情况2:解决 GeminiDB 等尚不成熟的数据库,其提交 SQL中不允许有注释信息(例如 "-- xxxxx")的问题

Z 最佳实践

SqlCommentStripper

import lombok.extern.slf4j.Slf4j;

import javax.annotation.Nonnull;
import java.util.regex.Pattern;

/**
 * SQL注释剥离器
 * @create-time 2025-09-10 23:48
 * @note
 *  为解决 GeminiDB 等数据库 的 提交 SQL中不允许有注释信息(例如 "-- xxxxx")
 *  在提交SQL到数据库前, SQL 中自动去除注释
 */
@Slf4j
public class SqlCommentStripper {
    //Pattern.MULTILINE : 用于处理多行文本 ; Pattern.DOTALL : 让.匹配包括行终止符在内的任意字符
    private static final Pattern SINGLE_LINE_COMMENT_PATTERN = Pattern.compile("--.*?\n", Pattern.DOTALL);
    //LAST_LINE_SINGLE_LINE_COMMENT_PATTERN : 解决SQL最后一行存在单行注释的问题
    private static final Pattern LAST_LINE_SINGLE_LINE_COMMENT_PATTERN = Pattern.compile("--.*?$", Pattern.MULTILINE);

    private static final Pattern MULTI_LINE_COMMENT_PATTERN = Pattern.compile("/\\*.*?\\*/", Pattern.DOTALL);

    /**
     * 自动去除注释
     * @param sql
     * @return
     */
    public static String stripComments(@Nonnull String sql) {
        //eg: sql = "SELECT * FROM users WHERE id = 1; -- This is a single-line comment\n-- test1\n/* Hello Guys \n * This is a multi-line comment! */-- test2\n/* test 3*/SELECT * FROM product WHERE id = 2;-- test4";
        log.debug("strip-before-sql:\n{}", sql);

        String cleanSql = SINGLE_LINE_COMMENT_PATTERN.matcher(sql).replaceAll("\n");
        cleanSql = LAST_LINE_SINGLE_LINE_COMMENT_PATTERN.matcher(cleanSql).replaceAll("");//去除最后一行SQL存在单行注释的问题
        cleanSql = MULTI_LINE_COMMENT_PATTERN.matcher(cleanSql).replaceAll("");
        //eg : SELECT * FROM users WHERE id = 1; SELECT * FROM product WHERE id = 2;
        log.debug("strip-after-sql:\n{}", cleanSql);
        return cleanSql;
    }
}

X 参考文献

posted @ 2025-09-10 23:47  千千寰宇  阅读(31)  评论(0)    收藏  举报