通过Java正则表达式去掉SQL代码中回车换行和多余空格
程序员文章站
2022-05-04 17:01:43
复制代码 代码如下: public static void main(string[] args) { string sql = "select * from \n" +...
复制代码 代码如下:
public static void main(string[] args) {
string sql = "select * from \n" +
" `testdb`.`foo` limit 0, 100";
string s = "select * from `testdb`.`foo` limit 0, 100";
string sql2 = pattern.compile(" {2,}").matcher(s).replaceall(" ");
string sql3 = s.replaceall(" {2,}"," ");
string sql4 = sql.replace('\r', ' ').replace('\n', ' ').replaceall(" {2,}"," ");;
string sql5 = sql.replace('\r', ' ').replace('\n', ' ').replaceall(" {2,}?"," ");;
string sql6 = sql.replace('\r', ' ').replace('\n', ' ').replaceall(" {2,}+"," ");;
system.out.println(sql2);
system.out.println(sql3);
system.out.println(sql4);
system.out.println(sql5);
system.out.println(sql6);
}
输出结果:
复制代码 代码如下:
select * from `testdb`.`foo` limit 0, 100
select * from `testdb`.`foo` limit 0, 100
select * from `testdb`.`foo` limit 0, 100
select * from `testdb`.`foo` limit 0, 100
select * from `testdb`.`foo` limit 0, 100
[code]
process finished with exit code 0
结果可以看出,有一个是没有去掉多余空格的。
可见java中的正则式,同样含义的还有多重写法,呵呵!其实主要是不同数量词匹配模式在作怪:
原版api文档中写道:
greedy 数量词
x? x,一次或一次也没有
x* x,零次或多次
x+ x,一次或多次
x{n} x,恰好 n 次
x{n,} x,至少 n 次
x{n,m} x,至少 n 次,但是不超过 m 次
reluctant 数量词
x?? x,一次或一次也没有
x*? x,零次或多次
x+? x,一次或多次
x{n}? x,恰好 n 次
x{n,}? x,至少 n 次
x{n,m}? x,至少 n 次,但是不超过 m 次
possessive 数量词
x?+ x,一次或一次也没有
x*+ x,零次或多次
x++ x,一次或多次
x{n}+ x,恰好 n 次
x{n,}+ x,至少 n 次
x{n,m}+ x,至少 n 次,但是不超过 m 次
但是,没有对三种方式进行更详细的说明,其实三种模式的区别如下:
greedy :尝试找到最长的匹配。
reluctant :尝试找到最短的匹配。
possessive :也尝试找到最长的匹配。
尽管greedy和possessive迫使一个matcher在进行第一次匹配之前读取整个的text,greedy常常导致为了找到一个match进行多次尝试,然而possessive让一个matcher仅尝试一个match一次。
下面是一个我工具中的方法:
[code]
/**
* 判断一条sql语句是否已经是分页的sql
*
* @param sql 源sql
* @return 是已经分页的sql时返回ture,否则返回false;
*/
public boolean isalreadysegmentsql(string sql) {
return sql.replace('\r', ' ').replace('\n', ' ').replaceall(" {2,}", " ").matches("(?i).+limit [\\d+ *|\\d *, *\\d+].+");
}
还是正则功能强悍啊!
补充:
下面这个两个注视的正则式,和第三个语意一样的:
复制代码 代码如下:
// reglist.put("(?i)bit\\([2-9]\\)\\z", "byte[]");
// reglist.put("(?i)bit\\(\\d{2,}\\)\\z", "byte[]");
reglist.put("(?i)bit\\((\\d{2,}|[2-9])\\)\\z", "byte[]");
本文出自 “熔 岩” 博客
上一篇: 正则表达式学习问答
下一篇: 应该如何构造复杂的正则表达式