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是贪婪匹配,那么贪婪匹配和非贪婪匹配有什么区别吗?
正则表达式中的贪婪匹配和非贪婪匹配主要区别在于它们匹配重复字符的策略:
- 贪婪匹配:在满足正则表达式匹配的前提下,尽可能多地匹配重复字符。贪婪匹配是正则表达式的默认行为。常见的贪婪匹配量词包括
*
(匹配0次或多次)、+
(匹配1次或多次)和{n,m}
(匹配n到m次)。
例如,对于字符串 "aaab",正则表达式 a+
会贪婪匹配到3个 "a"。
- 非贪婪匹配:在满足正则表达式匹配的前提下,尽可能少地匹配重复字符。非贪婪匹配可以通过在贪婪匹配量词后面添加一个问号
?
来实现,例如*?
、+?
和{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)代表匹配字符集的第几个分组,也就是第几个小括号内的字符集。