在Java开发中,我们经常需要对数据库定义语言也就是DDL相关的字符串做格式校验,比如判断一段文本是不是符合预期的建表语句模式。使用正则表达式可以在不连接数据库的情况下快速完成基础格式检查。

为什么要用正则校验DDL模式
DDL语句如CREATE TABLE、ALTER TABLE等具有相对固定的结构。通过正则匹配,可以在业务层拦截明显不合法的输入,减少后端数据库报错,也防止一些简单的注入问题。
常见的DDL模式特征
- 以CREATE TABLE或ALTER TABLE等关键字开头
- 包含合法的表名,表名可由字母、数字和下划线组成
- 跟随括号或具体的列定义片段
Java正则校验示例
下面给出一个简单的正则,用于校验类似CREATE TABLE user(id INT)这样的基础建表语句格式:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class DdlValidator {
// 匹配 CREATE TABLE 表名(内容) 的基础模式
private static final String DDL_REGEX = "^CREATE\s+TABLE\s+[a-zA-Z_][a-zA-Z0-9_]*\s*\(.*\)$";
private static final Pattern PATTERN = Pattern.compile(DDL_REGEX, Pattern.CASE_INSENSITIVE);
public static boolean isValid(String ddl) {
if (ddl == null) {
return false;
}
Matcher matcher = PATTERN.matcher(ddl.trim());
return matcher.matches();
}
public static void main(String[] args) {
String test1 = "CREATE TABLE user(id INT, name VARCHAR(20))";
String test2 = "DROP TABLE user";
System.out.println(isValid(test1)); // true
System.out.println(isValid(test2)); // false
}
}
正则说明
在上面的代码中,我们使用^CREATE\s+TABLE\s+来约束开头必须是CREATE TABLE加空白符。表名部分用[a-zA-Z_][a-zA-Z0-9_]*限制首字符与后续字符。最后用\(.*\)$表示以括号包裹的内容结尾。
注意事项
- 正则只做格式粗校验,不能替代数据库本身的语法解析
- 如果DDL非常复杂,建议使用专门的SQL解析器
- 匹配时加上Pattern.CASE_INSENSITIVE可忽略大小写
小结
通过Java正则表达式校验DDL模式字符串,是一种轻量且高效的防护手段。开发者可以根据实际业务扩展正则规则,将其封装为通用工具方法,在接口入参或脚本生成环节进行校验。