SQL的正则表达式(简单判断)

本文分享了一套用于判断SQL语法正确性的正则表达式,包括建表、删表、建库、删库、查询、删除、更新、插入、权限管理等操作,为数据库管理系统提供了一种快速检查SQL语句格式的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上学期做了一个简单数据库管理系统,判断SQL语法时百度了发现很少关于SQL的正则,所以分享一下,写得一般般,多多指教

//建表
  public static boolean isCreateTAB(String sql) {  
   String str="^[\\s]*CREATE[\\s]*+TABLE+[\\s]*[A-Z][A-Z]*[\\s]*"
     + "[(][A-Z][A-Z]*[\\s]*+[CHAR[(][0-9][0-9]*[)]|"
     + "VARCHAR[(][0-9][0-9]*[)]|INT][,[A-Z][A-Z]*[\\s]*"
     + "(CHAR[(][0-9][0-9]*[)]|[VARCHAR][(][0-9][0-9]*[)]|[INT])]*"
     + "[,PRIMARY[\\s]*KEY][(][A-Z][A-Z]*[,[A-Z][A-Z]*]*[)][)][\\s]*$";
   Pattern p=Pattern.compile(str,Pattern.CASE_INSENSITIVE);
   Matcher m = p.matcher(sql);
   boolean flag = m.matches();
   return flag;
  }
  
//测试语句:create TABLE A(ID INT,NAME CHAR(5),age int,D VARCHAr(12)),PRIMARY KEY(ID)

//删表
   public static boolean isDropTAB(String sql) {
    String str="^[\\s]*DROP[\\s]+TABLE+[\\s][A-Z][A-Z]*[\\s]*";
    Pattern p=Pattern.compile(str,Pattern.CASE_INSENSITIVE);
    Matcher m = p.matcher(sql);
    boolean flag = m.matches();
    return flag;
   }
//建库
 public static boolean isCreateDB(String sql) {
  String str="^[\\s]*CREATE[\\s]*+DATABASE+[\\s]*[A-Z][A-Z]*[\\s]*$";
  Pattern p=Pattern.compile(str,Pattern.CASE_INSENSITIVE);
  Matcher m = p.matcher(sql);
  boolean flag = m.matches();
  return flag;
 }
 
 //删库
  public static boolean isDropDB(String sql) {
   String str="^[\\s]*DROP[\\s]+DATABASE+[\\s][A-Z][A-Z]*[\\s]*$";
   Pattern p=Pattern.compile(str,Pattern.CASE_INSENSITIVE);
   Matcher m = p.matcher(sql);
   boolean flag = m.matches();
   return flag;
  }
/*select*/
 public static boolean isSelect(String sql) {  
  String str="^[\\s]*SELECT[\\s]*+([\\*]|[[a-z][a-z]*(,[A-Z][A-Z]*)*])"
    + "+[\\s]*+FROM[\\s]+([A-Z][A-Z]*)[\\s]*+(WHERE[\\s]*"
    + "+([A-Z][A-Z]*[=<>][^\\s]+[\\s]*(OR|AND)[\\s]*)*"
    + "([A-Z][A-Z]*[=<>][^\\s]+[\\s]*)[\\s]*)*$"; 
  Pattern p=Pattern.compile(str,Pattern.CASE_INSENSITIVE);
  Matcher m = p.matcher(sql);
  boolean flag = m.matches();
  return flag;
 }
//delete(删除记录行)  DELETE FROM 表名称 WHERE 列名称 = 值
 public static boolean isDelete(String sql) {
  boolean flag=false;
  String str="^[\\s]*DELETE[\\s]+FROM[\\s]+([A-Z][A-Z]*)"
    + "[\\s]+(WHERE[\\s]+([A-Z][A-Z]*[=<>]([0-9]|[\\'][A-Z][\\']))"
    + "(,[A-Z][A-Z]*[=<>][^\\s]+[\\s]*)*[\\s]*)*$";
  Pattern p=Pattern.compile(str);
  Matcher m = p.matcher(sql);
  flag = m.matches();
  return flag;
 }
//update      UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
  public static boolean isUpdate(String sql) {
   String str="^[\\s]*UPDATE[\\s][A-Z][A-Z]*[\\s]"
     + "SET[\\s][A-Z][A-Z]*=([0-9]|[\\'][A-Z][A-Z]*[\\'])"
     + "(,[A-Z][A-Z]*=([0-9]|[\\'][A-Z][A-Z]*[\\']))*[\\s]"
     + "WHERE[\\s][A-Z][A-Z]*[=<>]([0-9]|[\\'][A-Z][A-Z]*[\\'])"
     + "([\\s](AND|OR)[\\s][A-Z][A-Z]*[=<>]([0-9]|[\\'][A-Z][A-Z]*[\\']))*$";
   Pattern p=Pattern.compile(str,Pattern.CASE_INSENSITIVE);
   Matcher m = p.matcher(sql);
   boolean flag = m.matches();
   return flag;
  }
//insert
public static boolean isInsert(String sql) {
  String str="^[\\s]*INSERT[\\s]*INTO[\\s]*[A-Z][A-Z]*"
    + "[\\s]*[(][A-Z][A-Z]*(,[A-Z][A-Z]*)*[)][\\s]*+"
    + "VALUES+[\\s]*[(](([0-9][0-9]*|[\\'][A-Z0-9][A-Z0-9]*[\\']))"
    + "(,([0-9][0-9]*|[\\'][A-Z0-9][A-Z0-9]*[\\']))*[)]$";
  
  Pattern p=Pattern.compile(str,Pattern.CASE_INSENSITIVE);
  Matcher m = p.matcher(sql);
  boolean flag = m.matches();
  if(flag) {
   flag=matchAttribute(sql);//如果符合sql语法,进一步判断属性的个数跟值的个数是否一样
  }
   return flag;
 }
//属性列和值列匹配
public static boolean matchAttribute(String sql){
	boolean flat=true;
	String sqlArr[]=sql.split(" ");//按空格分,第三列对应属性列,第四个对应值列
	String sqlArr0=sqlArr[2].substring(sqlArr[2].indexOf("(") + 1, sqlArr[2].indexOf(")"));//属性列()中内容
 	String sqlArr1=sqlArr[3].substring(sqlArr[3].indexOf("(") + 1, sqlArr[3].indexOf(")"));//值列()中内容
 	String sqlArr01[]=sqlArr0.split(",");//()里按逗号分,匹配属性列数和值列数
  	String sqlArr11[]=sqlArr1.split(",");
	if(sqlArr01.length!=sqlArr11.length) {
        	System.out.println("属性列数和值列数不一致");
        	flag=false;
  	}
  return flag;


}
//权限
public static boolean isGrant(String sql) {
  boolean flag=false;
  String str="^[\\s]*GRANT[\\s]*+([A-Z][A-Z]*)(,[A-Z][A-Z]*)*"
    + "+[\\s]*+ON+[\\s]*[([A-Z.][A-Z.]*)(,[A-Z.][A-Z.]*)*+[\\s]]*"
    + "TO+[\\s]*([A-Z][A-Z]*)(,[A-Z][A-Z]*)*$";
  
  Pattern p=Pattern.compile(str,Pattern.CASE_INSENSITIVE);
  Matcher m = p.matcher(sql);
  flag = m.matches();
  return flag;
 }
 
 //测试语句:GRANT SELecT ON  D.B,M.DT TO  YJL,YXB
 public static boolean isGrantCreate(String sql)
 {
  boolean flag=false;
  String str="^[\\s]*GRANT[\\s]*+([A-Z][A-Z]*[\\s]*[A-Z][A-Z]*)"
    + "(,[A-Z][A-Z]*[\\s]*[A-Z][A-Z]*)*+[\\s]*+TO+[\\s]*"
    + "([A-Z][A-Z]*)(,[A-Z][A-Z]*)*$";
  
  Pattern p=Pattern.compile(str,Pattern.CASE_INSENSITIVE);
  Matcher m = p.matcher(sql);
  flag = m.matches();
  return flag;
 }
//撤销权限
public static boolean isRevoke(String sql) {
  boolean flag=false;
  String str="^[\\s]*REVOKE[\\s]*+([A-Z][A-Z]*)(,[A-Z][A-Z]*)*+[\\s]*"
    + "ON+[\\s]*[([A-Z.][A-Z.]*)(,[A-Z.][A-Z.]*)*+[\\s]]*"
    + "FROM+[\\s]*([A-Z][A-Z]*)(,[A-Z][A-Z]*)*$";
  Pattern p=Pattern.compile(str,Pattern.CASE_INSENSITIVE);
  Matcher m = p.matcher(sql);
  flag = m.matches();
  return flag;
 }

//测试语句:REVOKE    SELecT,DELETE ON  D,M.DT FROM  YJL,YXB
public static boolean isRevokeCreate(String sql)
 {
  boolean flag=false;
  String str="^[\\s]*REVOKE[\\s]*+([A-Z][A-Z]*[\\s]*[A-Z][A-Z]*)"
    + "(,[A-Z][A-Z]*[\\s]*[A-Z][A-Z]*)*+[\\s]*+FROM+[\\s]*"
    + "([A-Z][A-Z]*)(,[A-Z][A-Z]*)*$";
  
  Pattern p=Pattern.compile(str,Pattern.CASE_INSENSITIVE);
  Matcher m = p.matcher(sql);
  flag = m.matches();
  return flag;
 }
数据治理是指通过一系列的策略、流程和技术手段,对企业的数据进行有效管理、保护和优化,以确保数据的质量、一致性和安全性。数据治理的一个重要环节是规则校验,即通过编写和执行SQL语句,校验数据是否符合预先设定的规则和要求。 规则校验SQL是用来检查数据是否符合特定规则的查询语句。它可以用于验证数据的准确性、完整性、一致性以及合法性。规则校验SQL可以基于企业的业务需求和数据治理策略,设置不同的规则,如数据格式规则、唯一性规则、逻辑关系规则等。 在进行规则校验时,首先需要明确要校验的规则和数据表,然后编写相应的SQL语句来查询数据并进行校验。例如,要验证某个字段的长度不能超过指定值,可以编写一个类似于以下的SQL语句: SELECT * FROM table WHERE LEN(column) > maxLength; 如果查询结果返回了任何记录,则表示该字段长度超过了规定的最大长度,需要进行进一步处理。 另外,规则校验SQL还可以用于检查数据的一致性。例如,要确保两个表之间的关联字段具有相同的值,可以编写一个类似于以下的SQL语句: SELECT * FROM table1 INNER JOIN table2 ON table1.column = table2.column WHERE table1.column IS NULL OR table2.column IS NULL; 如果查询结果为空,则表示两个表之间的关联字段具有相同的值,否则则表示数据存在不一致的情况,需要进行进一步处理。 综上所述,规则校验SQL在数据治理中起着重要的作用,通过编写和执行SQL语句,可以有效验证数据的质量、一致性和合法性,帮助企业实现数据治理目标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值