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

本文出自 “熔 岩” 博客

时间: 2025-01-30 09:02:16

通过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

JS、replace利用正则表达式替换SQL所有参数为指定格式的数据_正则表达式

SQL参数格式 例如:select * from tb where nd=:nd and yd=:yd 想一次性把所有SQL语句中参数(带冒号)全部换成数据, 开始 选定用正则表达式. 原先写这样 复制代码 代码如下: strsql.replace(/(:\w+)/g,("$1").substring(1)); "$1" 总是本解析成字符串,而不是匹配的值 换成 复制代码 代码如下: strsql.replace(/(:\w+)/g,$1); 又不能给出匹配值,$1

正则表达式替换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

正则表达式中的反向预搜索(上)_正则表达式

在以前的应用,大多是应用正向预搜索情况.也就是说,在查找内容的右面有特定的内容限定,例如下面的例子: 复制代码 代码如下: var str3 = 'CPU: Intel Core2 5200; Memory: 2G;OS: Ubuntu 9.04'; var reg3 = /Memory\:\s+(.*(?=\;OS\:))/gim; str3.match(reg3); alert(RegExp.$1); //结果是2G (.*(?=\;OS\:) 就是典型的正向预搜索,只有右面内容是";OS:

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

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

javascript中使用正则表达式实现删除字符串中的前后空格_正则表达式

实例 复制代码 代码如下: <script> var str=" yexj00 "; str=str.replace(/^s*|s*$/g,''); alert(str); </script> 实例 模仿RTrim: 复制代码 代码如下: <script> var str="yexj00 "; str=str.replace(/s*$/g,''); alert(str); </script> 实例 代码以及测试代码如下

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源代码可以发现代码

正则表达式(regex)入门、元字符(特殊字符)学习与提高_正则表达式

什么是正则表达式呢?正则表达式,又称正规表示法.常规表示法(英语:Regular Expression,在代码中常简写为regex.regexp或RE),它是计算机科学的一个概念.正则表达式使用单个字符串来描述.匹配一系列符合某个句法规则的字符串.几乎在各种计算机编程语言中都有用到.可以分为普通正则表达式.扩展正则表达式.高级正则表达式.普通正则表达式在linux shell中常用到,高级正则表达式语法规范,基本由perl演化而来.目前常见程序语言(php,perl,python,java,c#