欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

通过Java正则表达式去掉SQL代码中回车换行和多余空格

程序员文章站 2024-01-28 20:12:52
复制代码 代码如下: 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[]");

本文出自 “熔 岩” 博客

上一篇: C++ prime/笔试总结六

下一篇: