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

复制代码 代码如下:

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[]");

本文出自 “熔 岩” 博客

时间: 2024-08-01 20:51:18

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

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

复制代码 代码如下: 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,}").ma

正则表达式替换SQL语句中的字段

问题描述 我想用正则表达式匹配一个insert的SQL语句,能够自动地将变量赋给对应的字段,比如SQL="insert into table(item1,item2,item3) values(:item1,:item2,:item3)"map.put(item1,"111")map.put(item2,"222")map.put(item3,"333")我想用正则表达式自动的将SQL语句中的:item1,:item2,:it

利用正则表达式去掉html代码

正则 using System.Text.RegularExpressions;//需要引用   // 利用正则表达式去掉"<"和">"之间的内容  private string StripHT(string strHtml)  {   Regex regex=new Regex("<.+?>",RegexOptions.IgnoreCase);   string strOutput=regex.Replace(strHt

PHP实现html源码中回车换行输出

 在源码中输入换行但是不显示像br 之类的字符我们需要通过php地转义字符来实现了,下文就一起来看看吧.     知识扩充   转移序列 说明 n 换行 r 回车 t 水平制表符 [/td> 反斜线 $ 美元符号 " 双引号 [0-7]{1,3} 此正则表达式序列匹配一个用八进制符号表示的字符 x[0-9A-Fa-f]{1,2} 此正则表达式序列匹配一个用十六进制符号表示的字符   用双引号(")定义字符串,PHP 懂得更多特殊字符的转义序列: PHP默认页面编码为HTML,要使

php代码中使用换行及(\n或\r\n和br)的应用_php技巧

代码a: 复制代码 代码如下: <?php echo'hello</br>'; echo'world!'; ?> output: helllo world! 代码b: 复制代码 代码如下: <?php echo'hello\n';//unix系统使用\n:windows系统下\r\n echo'world!'; ?> output: helloworld! 分析:浏览器识别不了\n或\r\n,这两个换行符是文本换行符,文本文件有效:在网页中查看HTML源代码可以发现代码

java正则表达式去掉重复\n

问题描述 Stringstr="认为.</p>nnnn 接受采访";变成串:Stringstr="认为.</p>n 接受采访";去掉重复的n,只留下一个n 解决方案 解决方案二:List<String>s=split(\s+);str="";for(Stringi:s){str+=i;}解决方案三:str=str.replaceAll("[n]+","n");解决方案四:

java-关于JAVA io修改txt文件中指定的问题

问题描述 关于JAVA io修改txt文件中指定的问题 我有一个学生成绩管理系统的txt原数据文件, 有一定的格式: 学号-姓名-科目一成绩-科目二成绩-科目三成绩-平均成绩-总成绩 如: 1-王雨-100-80-60-80-240 · - · · - · · - · 10-朱月红-0-70-23-33-94 · - · · - · · - · 解决方案 java io向txt文件中输入换行符解决python ConfigParser文件编码问题(按指定格式存储文件(txt))解决python

WPF中的换行符

原文:WPF中的换行符 WPF中UI上和后台代码中的换行符不同. 其中: XAML中为 C#代码中为 \r\n 或者: Environment.NewLine 版权声明:本文为博主原创文章,未经博主允许不得转载.

Java正则表达式(三)、代码量统计工具(统计java源文件中注释、代码、空白行数量)

       比如想统计一个Java程序员一天写代码的工作量(如:有效代码多少行.空行多少.注释多少行等),这个小工具也许能做为一个参考的依据.     思路:因为每个java源文件的内容基本包括java语句.空白行.注释三部份组成(不包括注解),所以要统计某个文件这三部份的内容各占多少时,只需写三个匹配这几部份内容的正则表达式即可.然后通过IO流读取文件中的每一行,并根据正则匹配的结果,累加每部份匹配的数量即可.     注释行:单行注释(//).多行注释.文档注释.正则:((//)|(/\\