提取SQL中的参数

SELECT id, userId, userName, userHead FROM user where id=#{id} and env=#{env} and name=#{name};

如何提取参数,并用占位符替换参数?

 public static void main(String[] args) {
        String PS1 = "(#\\{(.*?)})";
        String PS2 = "#\\{([^}]+)}";
        String PS3 = "(#(\\{(.*?)}))";
        String sql=" SELECT id, userId, userName, userHead FROM user where id=#{id} and env=#{env} and name=#{name};";
        Map<Integer, String> parameter = new HashMap<>();
        Pattern pattern = Pattern.compile(PS3);
        Matcher matcher = pattern.matcher(sql);
        for (int i = 1; matcher.find(); i++) {
            String g0 = matcher.group();
            String g1 = matcher.group(1);
            String g2 = matcher.group(2);
            String g3 = matcher.group(3);
            System.out.println("g0->"+g0+",g1->"+g1+",g2->"+g2+",g3->"+g3);
            parameter.put(i, g3);
            sql = sql.replace(g1, "?");
        }
        sql = matcher.replaceAll("?");
        System.out.println(sql);
        parameter.forEach((k,v)->{
            System.out.println("k:"+k+",v:"+v);
        });
    }

输出:
g0->#{id},g1->#{id},g2->{id},g3->id
g0->#{env},g1->#{env},g2->{env},g3->env
g0->#{name},g1->#{name},g2->{name},g3->name
 SELECT id, userId, userName, userHead FROM user where id=? and env=? and name=?;
k:1,v:id
k:2,v:env
k:3,v:name

正则表达式PS1和PS3是非贪婪匹配,PS2是贪婪匹配,那么贪婪匹配和非贪婪匹配有什么区别吗?

正则表达式中的贪婪匹配和非贪婪匹配主要区别在于它们匹配重复字符的策略:

  1. 贪婪匹配:在满足正则表达式匹配的前提下,尽可能多地匹配重复字符。贪婪匹配是正则表达式的默认行为。常见的贪婪匹配量词包括 *(匹配0次或多次)、+(匹配1次或多次)和 {n,m}(匹配n到m次)。

例如,对于字符串 "aaab",正则表达式 a+ 会贪婪匹配到3个 "a"。

  1. 非贪婪匹配:在满足正则表达式匹配的前提下,尽可能少地匹配重复字符。非贪婪匹配可以通过在贪婪匹配量词后面添加一个问号 ? 来实现,例如 *?+? 和 {n,m}?

例如,对于字符串 "aaab",正则表达式 a+? 会非贪婪匹配到1个 "a"。

总结:

  • 贪婪匹配:在正则表达式匹配成功的前提下,尽可能多地匹配字符。
  • 非贪婪匹配:在正则表达式匹配成功的前提下,尽可能少地匹配字符。

 Matcher.group(int) 方法如何使用?

不知道你注意到了java.util.regex.Matcher#group(int)吗?就是一下几行代码:

String g0 = matcher.group();
String g1 = matcher.group(1);
String g2 = matcher.group(2);
String g3 = matcher.group(3);

group函数是与你的正则表达式有关的,String PS3 = "(#(\\{(.*?)}))"; 这行代码表示正则会匹配3个分组,分别是group(1)表示#{param},group(2)表示{param},group(3)表示param,上述输出group()和group(1)是一样的,不要错误以为group()等价于group(1),看代码:

 public static void main(String[] args) {
        String PS1 = "(#\\{(.*?)})";
        String PS2 = "#\\{([^}]+)}";
        String PS3 = "(#(\\{(.*?)}))";
        String PS4 = "[a-z]+(#(\\{(.*?)}))";
        String sql=" SELECT id, userId, userName, userHead FROM user where id=aks#{id} and env=aks#{env} and name=aks#{name};";
        Map<Integer, String> parameter = new HashMap<>();
        Pattern pattern = Pattern.compile(PS4);
        Matcher matcher = pattern.matcher(sql);
        for (int i = 1; matcher.find(); i++) {
            String g0 = matcher.group();
            String g1 = matcher.group(1);
            String g2 = matcher.group(2);
            String g3 = matcher.group(3);
            System.out.println("g0->"+g0+",g1->"+g1+",g2->"+g2+",g3->"+g3);
            parameter.put(i, g3);
            sql = sql.replace(g1, "?");
        }
        sql = matcher.replaceAll("?");
        System.out.println(sql);
        parameter.forEach((k,v)->{
            System.out.println("k:"+k+",v:"+v);
        });
    }

输出:g0->aks#{id},g1->#{id},g2->{id},g3->id
g0->aks#{env},g1->#{env},g2->{env},g3->env
g0->aks#{name},g1->#{name},g2->{name},g3->name
 SELECT id, userId, userName, userHead FROM user where id=? and env=? and name=?;
k:1,v:id
k:2,v:env
k:3,v:name

 group()或者group(0)表示当前匹配的全部字符,group(x)代表匹配字符集的第几个分组,也就是第几个小括号内的字符集。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值