本文转载自微信公众号「程序员鱼皮」,作者 鱼皮。转载本文请联系程序员鱼皮公众号。
大家好,我是鱼皮,今天分享一个小知识。
我最近负责的工作是设计一个 SQL 解析引擎。简单来说,就是将一个 SQL 表达式字符串,解析为一颗对象树,从而执行查询等一系列操作。
SQL 解析原理
在最开始,我就遇到了一个很头疼的问题,用户编写的 SQL 语句可能非常不标准!
理想的 SQL 语句,缩进很规范,没有多余的字符:
- select * from user;
而现实往往是这样的:
- select * \n
- rom user;
上述语句不仅缩进、换行很随意,还多了很多无意义的字符串,比如 "\n" !
因此,想要设计一个通用性强的 SQL 解析引擎,首先要对字符串进行 预处理,将输入的 SQL 语句标准化。比如去除回车、换行、冗余的空格和特殊字符等。
那问题来了,如何去除字符串中的所有 "\n" 呢?注意,这里的 "\n" 并不是换行符,而是由字符 '\' 和字符 'n' 组成的字符串!
- # 转换前
- select * \n
- from user;
- # 转换后
- select * from user;
首先我想到了两种思路:
我这里选择后者,直接用现成的方法会比较方便,而且借助强大的正则表达式,可以同时替换掉多个冗余字符。
Java 正则表达式定义:
- /*
- * 全部替换
- * regex 正则表达式
- * replacement 要替换成的新串
- */
- public String replaceAll(String regex, String replacement) {
- return Pattern.compile(regex).matcher(this).replaceAll(replacement);
- }
刚开始我想的太简单了,直接编写出如下代码:
- str.replaceAll("\n", "");
结果,并不能顺利地替换掉字符串中的 "\n",仅仅是把换行符去掉了!
用单个反斜杠的结果
原因很简单,在 Java 字符常量中,反斜杠(\)是一个特殊的字符,被称为 转义字符,它的作用是用来转义后面一个字符,本身不具有实际意义!
因此,不能用下面这种方式直接输出反斜杠:
报错
如果想要单独输出一个反斜杠,需要再加上一个反斜杠转义:
无报错
同理,想要输出一个 "\n" 字符串,代码要这么写:
- System.out.println("\\n")
那不妨试试这个正则表达式:
- str.replaceAll("\\n", "");
结果出乎意料,竟然和只用一个反斜杠时的效果一样!仅仅是移除了换行符。
用两个反斜杠的效果
其实,正确的答案应该是使用 四个反斜杠,因为反斜杠在 Java 和正则表达式中都是转义字符!
其中,第一个斜杠是转义符,第二个斜杠是斜杠本身,第三个斜杠又是转义符,第四个斜杠是斜杠本身。
在 Java 中,输出 "\n" 字符串需要两个反斜杠和一个 'n',在 Java 的正则表达式中,要给这两个反斜杠分别再分配一个反斜杠进行转义,才能生效。
总而言之,记住一句话:Java 正则表达式中,匹配一个反斜杠要用四个反斜杠!
深入浅出AbstractQueuedSynchronizer 在Java多线程编程中,重入锁(ReentrantLock...
本文转载自微信公众号「脑子进煎鱼了」,作者陈煎鱼 。转载本文请联系脑子进煎鱼...
2020年,AWS的年收入规模已经超过450亿美元,营收增速和运营利润率超过30%。IDC...
对于广大的 Flink 开发者同学来说, 什么内容是最期待的? 什么信息又是最有用的...
随着云计算、物联网、移动互联网等互联网技术的快速发展,人们对于网络技术的依...
作者 | 黄玉奇 来源 | 阿里巴巴云原生公众号 日前,在由全球分布式云联盟主办的...
hk 域名 哪里注册? .hk域名 在国内是可以注册的,只要提供了.hk 域名注册 服务...
FFmpeg备忘清单 ffmpeg命令行工具的有用命令列表。 下载FFmpeg:https://www.ffm...
只有 域名 能备案吗?不能的,备案是需要国内空间的, 虚拟主机 或者服务器的都...
怎么升级 虚拟主机 ?当网站运营到一定阶段,虚拟主机配置跟不上网站发展,这时...